Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!2 \3 m5 ]- K2 v7 z3 u" x' |- W o
- #!/usr/bin/env python! M. ]2 X2 N/ ^
- # -*- encoding: utf-8 -*-
) B2 N! N7 j, z- T( Z: y3 D - # Created on 2019-05-05 21:43:11
- C& O& p6 h! H9 N - # Project: XiaoShuo
) ^4 V, e4 {! c; L1 G9 _ -
+ ]4 q2 `% s# ]" \8 ] - from pyspider.libs.base_handler import *
( Z" r+ \) i$ a) R" J! v; H2 v - import pymysql5 v3 u ~ [: r
- import random# @8 T" q# j; g$ Z# q/ b3 e% B# k
- import datetime' `, ]$ ^: T$ j Y
- import urllib2,HTMLParser,re: Q z2 Q5 A+ p
- import os- f8 o6 n/ g" n0 [! T/ }6 c7 i
- import sys% V/ P) I2 f+ [ O9 A. u* N
- import re3 E1 i/ g) S: \6 j+ W0 p: c1 F" U+ ]2 C
- import codecs8 d2 E& c! X7 f+ o; W2 @2 U
- import requests
7 @; r0 y% k3 e8 Q2 i" @0 l' N1 t! f - import json
5 o2 N3 ~9 H& C6 N4 s/ z -
% x! I4 ]. A9 k1 u - class Handler(BaseHandler):2 \3 l+ r8 k; @; L9 V* A
- global Datos2 D7 _; q. w1 Z' Y( E5 L
- global P_dir 0 p! v$ k! \: Y4 h
- P_dir = '/Tools/Debug/' #采集时候图片保持到本地的路径+ U: h2 i- L |( J P
- global Datos) e' A- h6 S, p9 ^& e
- Datos = {}9 i. ^! n5 T7 Q$ ^; w
- headers= {5 _9 A$ \' s3 S6 m, J& \
- 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',! y5 v% A: ]+ _5 N, n: P+ l. j1 q/ P
- 'Accept-Encoding':'gzip, deflate, sdch',8 B& |6 }& `3 I ~ Z
- 'Accept-Language':'zh-CN,zh;q=0.8',6 z# c- m {. J" D) |' S
- 'Cache-Control':'max-age=0',
, o& w# N) G( U0 w! D0 [ - 'Connection':'keep-alive',- ]& F) @4 w) h
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'- k4 q+ K* k0 D1 O! S& b& J. H9 Q* e
- }# L0 Q6 Z( K, Z- h9 l( m
- crawl_config = {/ f& Z& V8 s2 G$ Z }
- 'headers' : headers,
" X8 `' W' @" c+ Y, N$ b+ C, I - 'timeout' : 300
6 k+ B( c: j' w; d, X - }
9 h. ]2 f+ _$ f* E$ c - def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):- ~7 W6 p. g) p8 s* l9 C
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
+ N4 n$ {0 N# ~; Z - try:: X) o$ I9 ^' ?4 j
- cursor = db.cursor()0 h$ ]! H9 Z/ a/ Z( o- d3 O
- #注意此处字符串的占位符要加双引号"%s"* k# S+ ~! o% h* ~2 t! d% u
- sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
- v2 |2 G1 l3 }( S* `) z - # print(sql)
$ q+ F* q- Z* Q - cursor.execute(sql)
0 w: \ D* ^8 |0 D" o - , `' r5 Q% I- t5 A
- #qid = cursor.lastrowid& a: F" ~$ \/ l# V9 c) h* l
- #print(qid)
5 X$ R) k7 F* D8 X$ [3 Z -
3 D+ C3 y$ v1 f; m5 j7 j - db.commit()
. w7 {& K% I O* l - except Exception as err:6 _# e" w$ c& E H, m
- print("Error %s for execute sql: %s" % (err, sql))
1 s5 N' w; a- [- ]! ~ - db.rollback()
& G* _+ S. z; B* M( o# m - def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):+ H* Y) L! b% o% C- Z4 P, u
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
: k7 D9 ~( Q9 b! B$ P( \ - try:- t$ ^' d- e2 j! O
- cursor = db.cursor()
0 m5 I$ I* \1 T9 e2 z7 p - #注意此处字符串的占位符要加双引号"%s"
% A( E* ^2 b; @: Z6 H9 g" H; b - sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
/ Q6 N0 E' K; c8 m& a7 ?3 N1 K- ~ - # print(sql)0 ^; _7 I" x# X3 t% ~' `8 H4 }
- cursor.execute(sql)
8 N: v# |( H$ \4 k -
, M; A+ Q1 `& L2 c' F8 N - #qid = cursor.lastrowid
4 g2 R$ J# B9 w9 J1 X l2 ` - #print(qid)
' R3 d" k7 r$ j" Y+ a - 6 f0 K1 P, U: f; t& Z0 L
- db.commit(), b$ ]/ o7 p0 b2 v/ B
- except Exception as err:. h( M2 ^; h4 ]/ B4 ~0 D
- print("Error %s for execute sql: %s" % (err, sql))1 E# J* x( h) y# B
- db.rollback()7 t/ I9 f. z$ I5 t/ }* X
- def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):' J. X! E# N3 N; f) o% w* R3 p* f$ i
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")$ E( I/ S ], R! Z5 M6 ?" {" U
- try:8 X. ^4 q, a7 u* b& G3 q5 h, ?
- cursor = db.cursor()* b/ t1 g) I- ?# E, }- t5 g
- #注意此处字符串的占位符要加双引号"%s"
- y; m/ X) O: R o5 I& d - sql = ' INSERT INTO BookConte (Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) VALUES("%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")' % (Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date);. B' q: I f" o1 n* Y1 E
- print(sql)
( a4 o9 L* A+ l# q. q/ t - cursor.execute(sql)
+ @/ c* i9 g2 A% y* N3 q& P - print(cursor.lastrowid)- Z N. \# E; G; e! H
- db.commit()/ C' F! G2 u& w, z( _
- except Exception as err:
2 i1 P G" N3 h: T% X - # except:4 D0 R" l" w0 P/ m" c4 ]9 A
- # print('Failed'): W8 z% j5 _; q6 G( L$ B
- print("Error %s for execute sql: %s" % (err, sql))
; H: w o! z$ D9 f$ d - db.rollback()$ G8 Q8 K4 r7 B5 P+ u+ o2 Y9 t
- ; ]! N1 _2 l3 E% U+ |5 C% G
- def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): # Z6 l, ]$ R; O' z
- reload(sys)3 E$ k6 v1 d7 E* r! k0 I S
- sys.setdefaultencoding("gbk")* L, E) E' ?& f( R$ K8 ?& F
- locoy_url = 'http://www.******.net/locoy/?my=book' #697火车头发接口地址: X; t$ G7 h9 V6 [( I
- locoy_data = {# R9 H' G, D# s: ]7 v' K
- 'my_u':'用户名', #后台用户名
; P- u8 t0 B: z - 'my_p':'密码', #后台密码' e7 E7 ^* c, y. u& |3 m0 Y
- 'subject_669977_net':Bookname.encode('gbk', 'ignore'),
8 K. d% {" A* }! w - 'caid':Cater_Name.encode('gbk', 'ignore'),
2 N! j5 z+ Y) a - 'title_669977_net':Booktitle.encode('gbk', 'ignore'),
# Q: n4 k- l- O6 Y: v - 'article':BookConte.encode('gbk', 'ignore'),( Z0 b5 s- h! N' s6 T
- 'author':Book_author.encode('gbk', 'ignore'),, B1 M- }$ O" ?+ X% Q
- 'ready_1':Book_Palabras.encode('gbk', 'ignore'),
4 y# k4 o5 w* C, W" P; b& { - 'thumb':Book_img,4 q! h* ^# Y, |
- 'content':Book_Introduction.encode('gbk', 'ignore'),
" b# _+ M" k, p8 H3 M5 K5 L8 L - 'abover':abover.encode('gbk', 'ignore')
2 t* q; B; U* ~5 g1 v- ? - }. X4 Q( @. v3 [7 _7 G" {7 U
- res = requests.post(locoy_url, data=locoy_data)
3 Z4 L3 S) e7 q! W$ m9 V - print res.text: ]& {2 K7 ?" f# U4 A4 A
- print res.content1 n. }3 d. z" [
- # print Dsd
* M% X; T& {6 _1 l" @! p - return res
0 E, |" l% ~4 I5 H - : k4 \9 \' ~1 T' q; V# m4 p" w
- def __init__(self):1 V' j. `9 `- w5 v" X* u, A
- self.base_url1 = 'https://www.****.cc/') X M! ?2 x( D' L
- self.base_url2 = '/'' c! m6 D$ U% L$ W4 C, k
- self.CaterId = []
, W7 o# F: T6 U% z - self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']9 {; I- k! B0 T' S' {$ W \
- self.page_num = 15 U3 O3 C- k* f( R
- self.total_num = 200 ( u$ e% A& Q- U( U7 y# o
- 0 x( Z8 W4 f# v" F9 S
- @every(minutes=8 * 60)2 \! G% w P$ u" E4 F8 ?' a
- def on_start(self):
3 m$ C1 L/ Q& F - global Cater_Name0 D% J! r7 G0 Y/ [
- Cater_Name = []
& J, Z2 [/ n; x - while self.page_num <= self.total_num:
+ g* S) \5 a% k; Y - for self.CaterId in self.CaterIds:
4 l/ i7 M5 j6 {( |" I - if self.CaterId == 'xuanhuan':
$ a' s' j1 J: k: m - Cater_Name = '玄幻'5 E' d( `" m9 J7 D+ d# i+ L
- if self.CaterId == 'wuxia':# x3 E3 H* }$ A1 [
- Cater_Name = '武侠'. Z- K) ^+ o% [
- if self.CaterId == 'lishi':
- q; w$ w5 a1 y$ V - Cater_Name = '历史'
. `. A g+ ?6 M9 _/ } - if self.CaterId == 'yanqing':
/ _1 Z6 s+ F% b' X1 J8 K - Cater_Name = '都市'
2 ^5 g2 p$ u0 Y5 o* y4 j* P - if self.CaterId == 'nvsheng':5 v( f: v( {4 e7 \( l) i
- Cater_Name = '都市'
3 V! v2 `: a% ^# r9 E% B - if self.CaterId == 'kehuan':0 d2 J" H" m# p8 z/ Q) @
- Cater_Name = '科幻'
( D, t9 J6 k1 }. I - if self.CaterId == 'kongbu':
+ V2 T) F% _: n0 m- R+ e - Cater_Name = '游戏'
+ C* t" E# G3 f5 F$ h - print self.CaterId
* {( c m3 U; g - url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/" ! _- M0 l6 O" K; c, B0 H
- self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
w' a( ?+ f4 W5 `6 q( G5 B* B - self.page_num += 1
$ z/ F9 Q5 j4 V1 {) D0 W -
" P/ i% K( Y5 d$ I' h7 \! g - def list_Caterg(self, response):
# ~/ N% \6 C8 s$ d - Cater_Name = response.save ^2 x% Z% e2 \- R, _
- for each in response.doc('.pic-list a[href^="http"]').items():
% a+ R! C* _' ? - self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)+ N) Q5 x& Y, L
- - x# d' g& F# I
- def list_Caterg_detail(self, response):
+ H& e! d' q( e - Cater_Name = response.save& ^; m6 E' c) W
- # print Cater_Name
0 n& {: j; w! Y' X - Bookname = response.doc('h1').text()
4 H8 N3 U- r/ Z - print Bookname0 K% U: R/ D3 j2 t0 k# R
- Book_author = response.doc('.authorname > a').text()
: C6 P" M. M. E6 r3 k - # print Book_author
g$ f( @2 {0 G' Y& d, L - Book_Introduction = response.doc('.book-intro > div').text()
! K# _% B" A0 y3 p - # print Book_Introduction, m( M- R$ _4 z9 h0 i: `
- Book_Synopsis = response.doc('b').eq(1).text()
( ?8 S8 i* I" ~4 d - # print Book_Synopsis
$ I4 g/ p, t' M0 ?# M K' I' E - Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]' j3 V1 P0 c" E/ y, t; h
- # print Book_Palabras- f$ Y, g1 h0 B |; W3 j% A: K/ _
- BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0] #小说ID
; G8 M- Z" k" D6 J" I) G/ E - # print BookIDs8 v! G: u4 e1 K- G
- Book_Dates = str(datetime.datetime.now())
3 m# O7 Y5 f7 P1 M4 W0 Z$ t - for imgs in response.doc('.bigpic > img[src^="http"]').items():
2 S8 g( E' e B4 K) D - img = imgs.attr.src
- r2 Y6 @/ C! \7 t6 O - print img: c" C. }! Z% }2 y" x: |. W
- #小说封面下载
! B. K X8 e" z |& |( O4 b' ], E - extension = self.getExtension(img)) \) M/ i+ r x! k- q' J1 e7 m: R$ j
- name = self.getname(img)
# R7 t' E' C4 r9 }3 u - file_name = name + "." + extension
- c0 f; n! E" t - imgDir = P_dir + name
/ B9 X) D$ g/ Q! K1 n( H1 p' e - Locaimg = imgDir + "/" + file_name% f$ `3 T4 m% |& \- V3 @
- print Locaimg
7 Y9 g# z' w" d0 {1 h2 g - if(self.download(P_dir, imgDir, file_name, img)): #这2行可注译,图片下载到本地
9 i& _' |, N4 V; X% `* \1 O - print('attachment url is ' + img) ## L/ k' F, `; \+ C9 D8 S0 m. \4 b
- Datos = {) z4 u0 w8 ~ l
- "Cater_Name":Cater_Name,3 a/ }7 H1 G& V! ^
- "Book_author":Book_author,
6 g8 c6 ~1 u) d - "Book_Introduction":Book_Introduction,
8 J8 ~' W. q7 F' o6 U3 Z. ?: G - "Book_Synopsis":Book_Synopsis,' V8 u1 ~* X/ E) z! y3 ?! I: P6 D
- "Book_Palabras":Book_Palabras,
2 l7 S% w7 ^, ?; e" b - "img":img,
$ G# O3 W9 v) R5 k$ E5 {/ u - }
8 Q) H( A& e% D9 c. Y- P - self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates) #这行可注译,数据库发布接口,方便其他系统的发布1 p: T" f7 E" H9 A% N+ Z! X
- for each in response.doc('div[class="bookbtn-txt"] a[class="catalogbtn"]').items():
% y3 F! X" [8 q- e - self.crawl(each.attr.href, callback=self.index_page,save=Datos)
, Z. N$ |, o( W - I0 u! R" J7 ?; K# h' r" }
- @config(age=8 * 60 * 60)
/ ?7 z9 u' H: D) q1 n" b4 r. @- z - def index_page(self, response): ) E1 J& N' y1 [% |& R
- Datos = {
3 r6 H; U5 ^' P - "Cater_Name":response.save['Cater_Name'],- S( {) T6 N: X' |6 F5 S, \
- "Book_author":response.save['Book_author'],
$ U# L# Z- ^; i& f6 _# C& v - "Book_Introduction":response.save['Book_Introduction'],
8 y; y- N7 t- p/ M5 T9 U - "Book_Synopsis":response.save['Book_Synopsis'],6 C+ m7 U' i2 C6 e
- "Book_Palabras":response.save['Book_Palabras'],
5 o y0 m" ^" j1 c: |+ e! ~, | - "img":response.save['img'],
7 i) D% n+ \' r5 i; W/ s( @ - }- Z+ u5 s5 f! T
- for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():; f) ?* U/ \" ]8 y* w# f8 r
- # for each in response.doc('.chapter-list a[href^="http"]').items():
, x* @" o# J5 Y8 v) Q - self.crawl(each.attr.href, callback=self.detail_page,save=Datos); U9 C8 v' \& o( S
- @config(priority=2)! S& ~8 `2 n3 D1 {( F& q$ I
- @catch_status_code_error
z% L: x3 a( c; Y, L9 X6 W& ^1 d - def detail_page(self, response):
: U+ R! U: o% U- e# x( S: p - NewRe1 = u'哈书': ^7 d" K- C# y' [ i0 Q3 G2 x
- NewRe2 = u'huhjsd.CC'( H/ a8 x$ {! D8 i, ?" `
- NewRe3 = r'^\\n\\n'
, y6 w! X4 [; i+ b0 O7 ` - NewRe5 = u'小说网'2 e! e& B9 E0 A6 U/ t1 F) H$ X
- NewRe6 = u'fgdfgf'4 Y; A) ]) D3 Y( _9 T
- NewRe7 = u'fgfgf'! C- \1 B: \8 f4 q
- NewRe8 = u'ffhgf'
( ]: X' h$ D6 }) N' H6 C% f - NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
* O6 m4 K, A+ Y9 R - ReC1 = u'静思': g9 t/ o' ~& ?5 J1 n) d
- ReC2 = u'aghgf.com'# F/ o2 ~+ }5 r3 c$ ^! v7 g ^$ N
- ReC3 = u'aghgfh.com', d7 M' w2 z1 G) g3 X: U# s
- ReC4 = u''. c* ]7 F3 U6 y. i% {6 ^0 J0 C
- ReC5 = u'文学网'! l3 T% k! z8 [( S% i' O
- ReC6 = r'<BR>'
3 W3 J' F; }( O6 r% E* J8 K* f - Bookname = response.doc('.readlocation a').eq(2).text() #小说名称
7 K9 H# ]1 Y- u5 y0 u7 z - print Bookname1 s+ d- `$ p9 U
- Cater_Name = response.save['Cater_Name'] # 小说分类
8 ?& M. S8 G* {4 x$ M - Book_author = response.save['Book_author'] #小说作者* L- w. \) p, D& g0 ?
- Book_Introduction1 = response.save['Book_Introduction'] #小说简介
, h7 `: D5 n( F$ ^4 A" e8 e - Book_Synopsis = response.save['Book_Synopsis'] #最近更新
( C+ N( [( \; m Z+ V: G# ?, q - Book_Palabras = response.save['Book_Palabras'] #小说字数
* _- Z; P% z" c - Bookurl = response.url #小说网址# b% u+ K, r$ V. A( \7 N
- Booktitle = response.doc('.article-title').text() #章节名称
0 i! a1 U" c6 m& A- r' }1 Z" @ - BookID = response.doc('.readset-r span').text() #小说ID
3 e' g, N9 n+ w8 u) a - BookConte1 = response.doc('.article-con').text() #小说章节内容: z4 W' z: z; t/ y
- abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction'] #小说状态(连载还是完成)
* @) u0 p6 u N3 v/ W3 b2 \ - Book_Date = str(datetime.datetime.now()) # 采集时间8 m% B2 b$ O7 W5 C* d9 y
- BookConte2 = BookConte1.replace(NewRe1 , ReC1)
; k* t5 E } o- W1 x - BookConte3 = BookConte2.replace(NewRe2 , ReC2)
& ~( k: l* {3 p7 T - BookConte5 = BookConte3.replace(NewRe5 , ReC5)& H( S& X0 x- B+ V. @
- BookConte6 = BookConte5.replace(NewRe6 , ReC2), D% Y+ z, G9 x* ?% Y" j
- BookConte7 = BookConte6.replace(NewRe7 , ReC2)
* ^; @ i+ b) W - BookConte8 = BookConte7.replace(NewRe3 , ReC6)
. E. c6 g- k- D# e9 H - BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8), O3 F2 z+ D, B
- BookConte = BookConte4.replace("\n\n","<br>")8 W) n- F# d) A. a% f% c: J, h0 X* G4 ?
- print BookConte
) G6 B8 H& R: a: t - Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)7 x9 F( P0 P: `2 L2 _
- Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)" L4 z5 |" L) c. g
- Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
) W9 k/ p4 B1 E& o: X - Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)2 f8 }" |% X- U/ X( k8 Q
- Titleid = response.url.split(BookID + "/")[-1].split("/")[0]
0 c- u* k/ t- I' `$ Z' N - Book_img = response.save['img'], #小说图片
$ M/ O$ U6 O3 A" Z2 x* i4 @( h* ` -
( e" B8 d3 ~7 P3 w& j - #insert into MySQL 小说入库. C( E) C1 k$ R% U; k$ R l
- self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布& Z# V, }- p% S; X. O
- self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布
# R8 ~& G+ u& N; { - #post提交发布% y3 O* u2 A z+ _. d1 Z% p
- self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover) #这行可注译,火车头发布接口,不需要可取消
5 |4 R# f8 k+ U& l$ r! W - Datos = {( B5 T! M" |/ J1 I
- "Cater_Name":response.save['Cater_Name'],
0 b& w% j1 Z% y% |2 V: {/ i. n" R - "Book_author":response.save['Book_author'],+ ?( e1 ^) W# l6 z, O( Z' I
- "Book_Introduction":response.save['Book_Introduction'],. y& w A; x% N$ R. I
- "Book_Synopsis":response.save['Book_Synopsis'],# F# _. I' D+ g
- "Book_Palabras":response.save['Book_Palabras'],3 d& [7 R$ a* c
- "img":response.save['img'],- N) u5 W) I8 y0 t8 D+ j( E, f
- }
& w8 }: e2 e# L# @, q7 I - for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
2 l: R+ ~) ~2 `2 _. W - self.crawl(each.attr.href, callback=self.detail_page,save=Datos) ; L& @( h0 W b. r; X
- return {
2 \4 Q! l" ^0 B8 n# b( T. i0 z" y - "Cater_Name":Cater_Name,- A+ G! e7 E- s8 Q
- "Bookname":Bookname,. @5 E6 p- _8 T. z5 I; @( e. a2 Y
- "Book_author":Book_author,
+ e1 `5 h. s" u: C5 J; U' A - "Book_Introduction":Book_Introduction,; L& e4 s- I& g' r1 \& Y
- "Book_Synopsis":Book_Synopsis,) n R0 O( h5 O0 X* v
- "Book_Palabras":Book_Palabras,
, w1 B. l) c0 e3 F% [0 K - "Book_img":Book_img,
" x7 ^" Q! q' o) B. ^ - "Bookurl": response.url,/ J- F. p' K. K: D
- "Booktitle": Booktitle,0 ?8 `1 x* X) ~ t2 @4 E$ U: _) F
- "BookID": BookID,1 K3 t2 v1 h- Z5 i5 C/ q
- "BookConte": BookConte,
5 u" E, n$ P. r' P - "Titleid": Titleid,
. I% @# D5 s) l. M( `+ g3 y - "abover":abover,
4 R" w$ T! Q; Z - # "Book_Date" = str(datetime.datetime.now()),/ _ |& s3 l/ w" n
- }6 I; Y* X7 A& p2 k5 \/ K$ @. D
- def download(self, P_dir, imgDir, file_name, Book_img):! W$ B! Y) t0 S; k9 p u6 B
- if not os.path.exists(imgDir): 2 u8 G5 ~- h$ ~; H1 D4 V
- os.makedirs(imgDir)
2 H/ j) A- _/ W" F- Q - file = imgDir + "/" + file_name7 k, Q9 ?( ^9 w, v
- # print file
+ M! ?- w t3 H - f = open(file, 'wb+')
+ S6 M- g" f/ k8 Z/ v - imag = requests.get(Book_img) 4 M. J% n/ D3 y: v2 G; N; s8 }
- f.write(imag.content)* H) H7 y9 G& H
- f.close()
) n! S# k: R* h! W, ? - #保存图片前
! d6 _) ^7 [( m" I# Y - def save_imgs(self,response):
0 a; A1 m- ~) I6 K! l) y; J - content = response.content
7 w) M) X. T. ]8 l6 o/ u - file_name = response.save["file_name"]
6 K5 ^! Z" b$ {3 r t- S( v - imgDir = response.save["imgDir"]
, C/ E( J, Y3 |# ~ - file_path = imgDir + file_name2 T3 o& N! M& U
- self.save_img(content,imgDir,file_path)
+ @% f2 o, F7 ^( O; J - #保存图片
8 B9 k; O# e: ?& v9 D - def save_img(self,content,imgDir,path):9 ^6 m' ~$ ^+ v- r5 c
- if not os.path.exists(imgDir):
: e |1 F1 C/ v - os.makedirs(imgDir)- n5 T1 z( L1 W! D% B9 a& j
- f = open(path,"wb" )# Z0 ~/ q1 @3 V
- f.write(content)
. ^! @1 d0 d l; j - f.close()
" W* a$ M: b( m - #获取url后缀名: q- T$ K9 M4 H
- def getExtension(self,url): ; ?1 d; H0 T2 d3 T7 I6 |
- extension = url.split(".")[-1]
' Q8 T# j7 u2 E1 H - return extension e; y$ h- y3 L9 u! z( }# E
- , E+ H% z6 X5 F) h9 N! a7 p
- #获取图片名- L$ }9 `6 J6 E/ _% f5 ^1 S
- def getname(self,url):
, H% M* R- o3 ~0 b - name=url.split("/")[-1].split(".")[0]! B; v6 e, O0 O( t; F
- return name
复制代码 1 n7 P3 @* q7 W
. M' C. y0 y0 [
|