Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!& t- ]7 s% e: {* Y% I; V
- #!/usr/bin/env python6 B6 \9 D& D# F% h, i( ` A3 q& M
- # -*- encoding: utf-8 -*-9 I+ C: w( V R1 Z3 X$ g
- # Created on 2019-05-05 21:43:11) ~: X& n7 z- s* T
- # Project: XiaoShuo. {9 Q z6 Z( w
- : O% n1 h* ?& E! P+ |
- from pyspider.libs.base_handler import *
) q) y, X+ z6 n3 w- c; K - import pymysql
8 K6 d1 a( s1 W$ ~( n! ~& F# u - import random5 I; B( w+ R& M4 e3 B$ M, c
- import datetime
$ V M9 j3 ^3 v9 j' s' S - import urllib2,HTMLParser,re% U! `- q' R* G! ?* j
- import os* b9 B: G! B% \
- import sys, f; M* z/ B' J8 @/ _1 B
- import re
2 z \2 \1 G+ Y. d - import codecs
2 J" v! }8 f, ?2 X7 Y: V; L - import requests# W T) Y# v" D8 ]$ D0 t( ~
- import json
. ^9 y0 s [% J- m$ i1 V - $ S3 z0 k3 r$ ]# b6 ]
- class Handler(BaseHandler):/ `# P" n! R+ O8 B. I X
- global Datos! U, D4 j8 t$ y6 W4 d
- global P_dir 5 j- \; ^/ ], }
- P_dir = '/Tools/Debug/' #采集时候图片保持到本地的路径
5 w$ D/ S( b- s# w6 r6 U/ t - global Datos
' A$ ? J3 ?; H" \ - Datos = {}* a7 q$ Q9 e$ v2 C, y. m$ V( v+ V) J( c
- headers= {
# f# u2 J* p. q/ W+ }8 W - 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
& X, k5 f% |2 N, K - 'Accept-Encoding':'gzip, deflate, sdch'," n" B9 j2 e. H( c: f
- 'Accept-Language':'zh-CN,zh;q=0.8',
% G) i1 C) @- Q; {# d - 'Cache-Control':'max-age=0',
4 t" n# ]* b+ I, }+ F - 'Connection':'keep-alive',7 _! q9 j( a* W- b9 p6 V( H+ N' y
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'
% T7 Y3 q! C: x8 y - }
1 w; J, R8 `& p4 g: f9 k6 S5 h( i9 X - crawl_config = {) u& u/ f( `( k* i' M
- 'headers' : headers,# s" G& Y+ ~( {# P7 i0 I1 c
- 'timeout' : 300
6 @2 i# O6 T' [6 S5 s8 q! P - }
' v: X% I) }7 e- V9 `: \3 ]4 G( z - def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
( N3 Z% g) ~8 \2 S - db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")+ X2 H7 J" D+ C. O6 }
- try:1 {; ~& P2 M8 V. D- b
- cursor = db.cursor()
1 t3 M2 d: `1 L% o( s- Z; \ - #注意此处字符串的占位符要加双引号"%s"
0 q/ M" @% s# q1 P" K, e3 e3 @ - sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
5 Y) ?8 U6 g n# h6 W - # print(sql)
* C; S, F' S+ A/ p- s9 T - cursor.execute(sql)2 x! l' G/ j& U# I
- . I8 \( M7 G2 Q' q$ ^& T* Q
- #qid = cursor.lastrowid/ [9 E3 S! @# ~% k5 J
- #print(qid)0 h" j* U" W* [
- 1 o- B8 b6 k2 z! C$ q' `
- db.commit(). I3 I* z0 R* n' I' y4 ~! G" i# N
- except Exception as err:' }! A$ N2 ?$ k8 w
- print("Error %s for execute sql: %s" % (err, sql))3 \' z2 u# x' d6 @" w3 a
- db.rollback()* b+ j$ [( _! ?& O
- def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
0 D/ r; K* E$ C" d! \9 w - db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
7 h" E- p: H8 T5 L8 a$ T9 H - try:
" \! A5 c9 a$ Q P5 G5 ?0 U& J( [ - cursor = db.cursor()% s% K+ N# i- W6 o" y0 C' l
- #注意此处字符串的占位符要加双引号"%s"4 j1 k* l( a$ p$ `
- sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);% F& o# g" k, [+ w# Q' i
- # print(sql)
$ Z O7 w# j: ~& s$ T9 r - cursor.execute(sql)
* K3 P. A0 D3 ]* L- }. Z0 z- R- j8 V - " o) d Y5 P, g8 ]; ~2 `
- #qid = cursor.lastrowid
, c9 O& F: M) G* U - #print(qid)& H* N8 _* z W# q% @' x7 \5 g. i
-
1 z' H4 W8 v* r3 _8 n" S( O# @: G! [! F - db.commit()
. d* Y8 Z/ ~) J( W5 ~4 C - except Exception as err:
2 F' q1 C8 U% u6 N: C8 i - print("Error %s for execute sql: %s" % (err, sql))
' \5 q7 l6 H# I3 N6 u G - db.rollback()
' z1 h: A3 y! { - def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):! [( ^5 ^( \; q# M6 i
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
& o( |, r3 }( Y- ] - try:
- p/ n3 L! G g1 R7 {3 Q. o - cursor = db.cursor()
* c8 L% ]( K' K' S/ f% ] - #注意此处字符串的占位符要加双引号"%s"$ E1 n5 B8 A6 k! b/ @
- 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);
& O0 n$ g# Z3 b - print(sql)9 j! e) Q5 `. x$ U4 d
- cursor.execute(sql)+ ^% E2 o; a. V1 ?; ^
- print(cursor.lastrowid)
* c7 j/ u3 e1 b2 ?+ D2 k3 W0 d - db.commit()
! u/ @ r* O3 P# p. ? - except Exception as err:
' C% W' o- l7 P: F. p, U - # except:7 X; ]6 D2 T2 ]: e
- # print('Failed')+ M- N1 v: k; `- g c
- print("Error %s for execute sql: %s" % (err, sql))
" S* I% g6 L% |9 w) E - db.rollback()
- d6 W. b b. z' } -
I6 u, | l7 i( T# t( ^3 R6 S - def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
* d G2 l3 _0 C& i8 Z# X! \ - reload(sys)) L U: T) n" e( r0 Y
- sys.setdefaultencoding("gbk")
6 y, g' a: |' s; c) i - locoy_url = 'http://www.******.net/locoy/?my=book' #697火车头发接口地址) d7 A! f" V' b0 O( I
- locoy_data = {3 V$ s: P1 z% G1 Z
- 'my_u':'用户名', #后台用户名
. [, C$ `3 p5 d6 c - 'my_p':'密码', #后台密码
2 t* C" I) F% v8 _- ~3 X- L, G - 'subject_669977_net':Bookname.encode('gbk', 'ignore'),
2 { {$ A0 `4 j$ s0 V. ] - 'caid':Cater_Name.encode('gbk', 'ignore'),8 @" {' \2 G) J8 l- G. x5 o: y
- 'title_669977_net':Booktitle.encode('gbk', 'ignore'),
) y" ]- M, w6 k% m" | - 'article':BookConte.encode('gbk', 'ignore'),
) Y6 o+ p3 J3 M - 'author':Book_author.encode('gbk', 'ignore'),
" l) z5 S% {- C' y, \# s, p1 Q- ~ - 'ready_1':Book_Palabras.encode('gbk', 'ignore'),% y6 ^1 O: Y- q5 f
- 'thumb':Book_img,
; g! M7 Z M1 H$ A9 W8 { - 'content':Book_Introduction.encode('gbk', 'ignore'),
4 k& D1 P( K% R$ V' ?8 [ - 'abover':abover.encode('gbk', 'ignore') / F& l: Z+ d% {. V8 g9 U9 _' g
- }9 F/ S) m+ y6 N# e7 t" i' ~7 J) w6 Y
- res = requests.post(locoy_url, data=locoy_data)
6 U4 R: F, e7 Q. R0 V - print res.text
9 @, O* @) }' N6 d. n9 [2 L - print res.content
4 G* _( G6 w$ T" R; L - # print Dsd
) P: L9 ^% u# E - return res9 s. L$ z3 J3 z
-
/ @2 V. B. Z1 y - def __init__(self):& m8 V* `+ u/ F- C) b
- self.base_url1 = 'https://www.****.cc/'* H: Y0 d1 f$ N6 h4 h0 ~, _
- self.base_url2 = '/'' ]4 z4 L6 f, {+ U% h; t @7 i/ b
- self.CaterId = []7 F1 Y; ]# Z% ?; r$ T
- self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
7 j2 j+ D9 @5 F6 y" ^6 h - self.page_num = 1' h, U! q* B# ]- v" i
- self.total_num = 200 7 t6 \4 P+ [9 V- v0 M1 D
- . G) F1 n8 @+ `# ]: E$ n
- @every(minutes=8 * 60)
+ u/ i ?% p! S. ]2 h0 c - def on_start(self):
3 j2 Q8 t6 ~7 c9 N _8 A* v- P - global Cater_Name
9 o, k' D4 |+ V3 e - Cater_Name = []
8 O/ R( `1 p3 Q - while self.page_num <= self.total_num: , a, A% T4 Q+ Y7 Y! _
- for self.CaterId in self.CaterIds:
4 `# o9 L+ R5 l# _3 c F6 O - if self.CaterId == 'xuanhuan':) f& Z Y" T+ t8 P2 [9 p
- Cater_Name = '玄幻'
; E; Y( Y5 |( l$ c. j - if self.CaterId == 'wuxia':
3 O3 O* Q3 v$ _' P - Cater_Name = '武侠'
0 N7 U7 B3 m7 ~# e1 e - if self.CaterId == 'lishi':
3 I6 M: t& A* N+ M$ B1 N, g - Cater_Name = '历史'
9 w* c& W- E; m, o5 S% ~ - if self.CaterId == 'yanqing':
6 [& c, n6 w% `* B - Cater_Name = '都市' * C0 M( r, P0 g7 W, o
- if self.CaterId == 'nvsheng':4 V) s8 j# \+ u2 q, Z) z, _: U
- Cater_Name = '都市'
2 \9 ~$ B v) [2 q/ ~ - if self.CaterId == 'kehuan':
& `9 n' v& w6 ^! ]; h6 M - Cater_Name = '科幻'
4 w2 ?- F( [6 `/ h - if self.CaterId == 'kongbu':
$ \* U n4 h- t+ b) i8 e; m - Cater_Name = '游戏'
0 h- A. d* |% s2 u, |: O - print self.CaterId
8 p( D& N6 I" }' m7 U$ E - url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"
1 B4 A- j- Q Q - self.crawl(url, callback=self.list_Caterg,save=Cater_Name), I1 P9 j( v- U, f9 ]& v5 X( A0 e
- self.page_num += 1 " S( X* R' W8 o2 @0 N5 ~# ^7 W m
- % r, G, J& D7 U
- def list_Caterg(self, response):7 I0 ~ f0 y2 A" S" T7 o7 }
- Cater_Name = response.save
' k3 k. e9 x, e+ c7 j6 u! q - for each in response.doc('.pic-list a[href^="http"]').items():5 I5 l" v+ o5 k
- self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)' g& z$ g6 `# ]+ i
- 8 P/ z: f/ z/ g2 M# p
- def list_Caterg_detail(self, response):) l1 R4 Q2 Z- S$ t s9 m1 R
- Cater_Name = response.save* k$ `. D+ g# p, M4 X
- # print Cater_Name
" N; b3 K8 z- E/ R- j - Bookname = response.doc('h1').text()/ q0 T9 Q+ W' f$ W
- print Bookname/ ?# i+ H7 Y/ a
- Book_author = response.doc('.authorname > a').text()
9 W4 v4 ~) G4 Z; F! R - # print Book_author
; ?8 H6 U3 b+ H/ B$ y$ i* j) v8 f - Book_Introduction = response.doc('.book-intro > div').text()
$ G9 f' N2 ~* ^ - # print Book_Introduction7 h5 ~, D% m" m6 F
- Book_Synopsis = response.doc('b').eq(1).text()
" Y: d' ?5 e. L5 m+ ^ - # print Book_Synopsis+ U7 R2 r E: L3 X" f
- Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]3 s& p4 w9 t& X5 _
- # print Book_Palabras' |- n' A* ?. r6 |( C
- BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0] #小说ID/ d7 s. H& h6 p2 h3 ]4 P N
- # print BookIDs
) Y9 b/ u7 E( i8 @3 o% s8 r - Book_Dates = str(datetime.datetime.now()) % B! i- L$ v6 L c
- for imgs in response.doc('.bigpic > img[src^="http"]').items():
, t: G% L1 ? _% K9 R' p2 P - img = imgs.attr.src
5 |' u" _3 `: V% B - print img
; j* J* C5 a: X6 w - #小说封面下载
. ?" L$ l3 `) [* U- m - extension = self.getExtension(img)/ N5 {7 i5 m# t: T
- name = self.getname(img) a0 D" ], j& ]- ~, y- e
- file_name = name + "." + extension) e$ N" k4 ^5 q/ m2 W2 t
- imgDir = P_dir + name7 X* c& {( S" W
- Locaimg = imgDir + "/" + file_name! n" M) q9 \6 u
- print Locaimg
$ q3 Z8 y1 d* f' u6 q. Z - if(self.download(P_dir, imgDir, file_name, img)): #这2行可注译,图片下载到本地
" v- c% L, J; @% o5 A2 i% H/ r, {0 H - print('attachment url is ' + img) #; d: D. p4 e. \0 {% t- B9 s; T% b
- Datos = {0 ]& V! n% l+ Z4 [8 L6 r
- "Cater_Name":Cater_Name,. A) R' p+ L+ B' |: V
- "Book_author":Book_author,
! x* ?& ~7 n5 Q Y - "Book_Introduction":Book_Introduction,8 m0 P- J; n9 R: ?& A+ E, Q
- "Book_Synopsis":Book_Synopsis,+ o2 U+ r; \" H
- "Book_Palabras":Book_Palabras,
" S9 h r* R4 A& }9 Q% y2 G - "img":img,
8 Q, \# O3 r. u" ` - }3 O' Z3 L% L4 u
- self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates) #这行可注译,数据库发布接口,方便其他系统的发布
5 @- l1 e8 {/ O4 |! l+ Q" w - for each in response.doc('div[class="bookbtn-txt"] a[class="catalogbtn"]').items():. }' O8 g: ?" Z0 u3 v. D. u
- self.crawl(each.attr.href, callback=self.index_page,save=Datos)
5 S2 F' p0 y) V6 }' m- e7 ~$ N -
: u: l0 J0 T, Z3 E$ b2 [- d& S% W - @config(age=8 * 60 * 60) ( ~) [/ b: J0 h
- def index_page(self, response):
8 h" ~& u8 d8 ?. O9 S - Datos = {
8 M1 b9 J0 b1 N' J - "Cater_Name":response.save['Cater_Name'],' z: u4 j# q2 t' c9 I
- "Book_author":response.save['Book_author'],
- g6 \4 t/ L d1 D - "Book_Introduction":response.save['Book_Introduction'],% r) B1 f4 n: g
- "Book_Synopsis":response.save['Book_Synopsis'],
' h7 z9 t; R8 Q: w, R- w2 a - "Book_Palabras":response.save['Book_Palabras'],& T# V( t" C) }- C: `& Z0 f7 u
- "img":response.save['img'],
; w' _! x/ H+ w" X ~9 D' q1 T - }8 y/ w( Q9 S \5 M) j, [* \
- for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
( W) ~% n; R z) q - # for each in response.doc('.chapter-list a[href^="http"]').items():
4 t6 X6 r& q) B" \+ v. m/ j) h8 c0 Z - self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
5 i% ?$ a" G8 c" I F0 L - @config(priority=2)
, e1 V! w) `) A9 ]4 `: ` - @catch_status_code_error
4 K! @2 m9 F, f9 V - def detail_page(self, response): w' C4 Q4 [ O3 o$ E
- NewRe1 = u'哈书'5 x- _9 I% M( m* J" r( Q9 g l4 g
- NewRe2 = u'huhjsd.CC'3 y- w' T1 X9 L; e$ M( b8 d
- NewRe3 = r'^\\n\\n'6 t9 g4 E. C$ O: A' r
- NewRe5 = u'小说网'5 l6 g+ c& k* X, F: V0 R2 ^7 e
- NewRe6 = u'fgdfgf'
; x% M: w: { m* K - NewRe7 = u'fgfgf'
2 P' O9 t8 G) g# O9 |9 C* D - NewRe8 = u'ffhgf' Q8 q5 F1 G/ o+ z! I
- NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'% c4 l& C. H3 t7 h- {5 r7 A0 Q
- ReC1 = u'静思'' N" L. u4 ^' k8 B/ z, f5 i, Z
- ReC2 = u'aghgf.com'- ^- H3 l+ U. ~. w/ |
- ReC3 = u'aghgfh.com'
, M2 @ w$ i. m, p$ S, s5 B - ReC4 = u''
- j* h: x0 M' b ~ - ReC5 = u'文学网'' F8 F6 |. b! \3 E6 k; G
- ReC6 = r'<BR>'- ~9 L" w h9 [
- Bookname = response.doc('.readlocation a').eq(2).text() #小说名称: @+ V6 Y: L$ Z6 r0 _: a7 F h
- print Bookname9 S, j. j9 ]4 b' ^
- Cater_Name = response.save['Cater_Name'] # 小说分类
) @0 j4 D% n' y9 E- @1 a+ |* Q - Book_author = response.save['Book_author'] #小说作者4 m/ _+ d# N3 Y$ D' n: p6 d
- Book_Introduction1 = response.save['Book_Introduction'] #小说简介
& t1 V) }5 u! N$ E/ r j8 p - Book_Synopsis = response.save['Book_Synopsis'] #最近更新9 N3 y& [0 t1 K# s/ J6 f3 L1 U5 s
- Book_Palabras = response.save['Book_Palabras'] #小说字数
' h4 ?" ?( J/ n4 K" { - Bookurl = response.url #小说网址
( a5 n- g" z) s: ?( U j; _ - Booktitle = response.doc('.article-title').text() #章节名称) W/ H. o% m" z V
- BookID = response.doc('.readset-r span').text() #小说ID5 X5 v/ X! X3 b- o# q( f5 Z
- BookConte1 = response.doc('.article-con').text() #小说章节内容; J* R, z) x/ ]8 \
- abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction'] #小说状态(连载还是完成)4 W; Y, U& O$ k8 G$ d. H( Z5 i
- Book_Date = str(datetime.datetime.now()) # 采集时间
[+ s/ D+ ^: {1 F4 x3 e: V+ { - BookConte2 = BookConte1.replace(NewRe1 , ReC1)+ ` ]4 r) k; J8 w7 ^
- BookConte3 = BookConte2.replace(NewRe2 , ReC2)7 W) n4 x0 v! x E( ~3 @% ?
- BookConte5 = BookConte3.replace(NewRe5 , ReC5)( M( x7 L& N3 U2 L) x
- BookConte6 = BookConte5.replace(NewRe6 , ReC2)
" Q8 K* e m' u6 d* F - BookConte7 = BookConte6.replace(NewRe7 , ReC2)5 \7 }; }' b& l6 L
- BookConte8 = BookConte7.replace(NewRe3 , ReC6)
2 D$ @0 |8 u! i, d9 `. h; c - BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
8 g( M3 f7 v+ S! h x7 |* ? - BookConte = BookConte4.replace("\n\n","<br>")
7 J8 l) Q4 t& R - print BookConte6 p* [9 ~" z n. g5 T
- Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
4 I7 ~5 a8 `- P4 W! a# T - Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
: ]$ Q" Q; @/ S" }) v! e - Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)1 z5 q u2 r5 V! o; n# H% p
- Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)* \' ?6 I% p6 F6 K B; E& o
- Titleid = response.url.split(BookID + "/")[-1].split("/")[0] . w: N# e/ w& w }
- Book_img = response.save['img'], #小说图片
" z: ^& \. d- [- L" Q% p -
. I- [9 |) n; t - #insert into MySQL 小说入库4 i1 Y, S0 A. M3 I
- self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布
+ q1 S/ e2 P3 G" u9 m! r - self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布
7 D0 ~0 @' v. ` - #post提交发布
! m) M0 d* k( {- l L% l! ]0 K' | - self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover) #这行可注译,火车头发布接口,不需要可取消' [3 b( D0 |8 o. {
- Datos = {* p8 I# z2 y& n& w
- "Cater_Name":response.save['Cater_Name'],! z8 d/ X) O& d% ]# L- d2 d" R
- "Book_author":response.save['Book_author'],: z, K: G5 h M3 `1 B6 W5 c
- "Book_Introduction":response.save['Book_Introduction'],6 Z6 k) B* z V+ I
- "Book_Synopsis":response.save['Book_Synopsis'],
' ?9 J h/ _5 A2 O" e% Z - "Book_Palabras":response.save['Book_Palabras'],/ _" U. R: w2 I" G0 {, {
- "img":response.save['img'],
; R( E4 Y1 }, x0 n3 m* j - }0 W. A2 N4 \8 e0 R( d( W- S' f
- for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
* _9 u. t. k( |, o8 I" P9 J2 K - self.crawl(each.attr.href, callback=self.detail_page,save=Datos) : c! d8 x7 o4 W. O8 X
- return {2 I" v' y# K7 t7 ^9 f f
- "Cater_Name":Cater_Name,
7 m. B2 H+ q) b8 H# R - "Bookname":Bookname,
# h8 B+ {" S8 r% y$ D8 i8 t - "Book_author":Book_author, ^2 J% O6 z4 p! e+ A( U/ O& E4 S' x6 f2 f
- "Book_Introduction":Book_Introduction,- M' _4 q8 s( V% o9 `2 R
- "Book_Synopsis":Book_Synopsis,
# A/ m1 | h: ?1 E( @5 Y. Q - "Book_Palabras":Book_Palabras,0 G/ B: Y' S+ }9 k( ]
- "Book_img":Book_img," t4 A% V ~# ?4 _, J
- "Bookurl": response.url,
$ U" Z a$ F3 ?/ D3 ` - "Booktitle": Booktitle,6 |, I3 k# I& H: [7 L% o. s% F) ~0 m
- "BookID": BookID,' `3 Z$ G2 X' y. C/ J9 } r
- "BookConte": BookConte,4 b# X- l5 @$ R1 L4 c8 \- A
- "Titleid": Titleid,! H) i" ]* D, E9 u- q# U
- "abover":abover,
8 `$ s, W, t* o7 l5 u' Q" N: H - # "Book_Date" = str(datetime.datetime.now()), m/ Y$ M. ^! s0 z$ k! `& K, r4 m
- }
4 g! e/ E! B) K# ~% c# t& x C9 c - def download(self, P_dir, imgDir, file_name, Book_img):: Q( @& y& f4 x
- if not os.path.exists(imgDir): / U, ]3 @8 A$ V. l2 L# U* l, l& G
- os.makedirs(imgDir)- L" }' p; q& @0 l
- file = imgDir + "/" + file_name& V6 w5 w5 l: _, v4 z2 l3 u
- # print file f& Y) X4 P5 }+ `" f7 z/ U; P
- f = open(file, 'wb+')1 o8 e% `" x4 R# x# F$ y
- imag = requests.get(Book_img) 1 G1 y9 L5 b# g6 Z! D$ _
- f.write(imag.content)
}- G, _; q( L- W( y - f.close()- P" \3 }7 y* L# Q1 L; A5 K- S4 D% a
- #保存图片前8 i* \# z) ^6 T1 ~! {9 J, |
- def save_imgs(self,response):
# A' R3 p' [' D" {' Q - content = response.content
3 v, {" w- E4 ? - file_name = response.save["file_name"]2 L5 s; C4 Y* o9 |# K# @
- imgDir = response.save["imgDir"]
. c& q8 k0 S" n# n+ N1 u4 Q - file_path = imgDir + file_name' z, f7 o: H/ q1 }" k& W
- self.save_img(content,imgDir,file_path)
, k0 N9 o' Y) [$ _$ J - #保存图片
. j7 p4 J, I- S T1 k - def save_img(self,content,imgDir,path):8 ^) ^2 Y, q- I
- if not os.path.exists(imgDir):
8 k, X2 K7 ~% z+ w3 ~ - os.makedirs(imgDir)
4 D" W3 n+ a! a! E - f = open(path,"wb" )* ]4 { e9 b7 C: H& \) |% n& ?8 ]/ R
- f.write(content)
) k6 M& Y( ~4 w# Q - f.close()* D9 I" J' e8 [
- #获取url后缀名 z1 A$ [' G# X' z0 }4 |
- def getExtension(self,url): 1 R7 `8 v2 q, T1 p5 A5 I
- extension = url.split(".")[-1]
K) b) t: g/ Y1 q, j - return extension
y+ g$ |/ Q9 o -
0 V& r$ T5 _- q) M' y- f - #获取图片名
/ Z9 ]. f8 y0 x - def getname(self,url):1 `$ M- X n' ?7 Q4 {& ~
- name=url.split("/")[-1].split(".")[0]
5 I7 ]6 ~! Y4 H; o9 X6 a" {( ~, U3 g* k - return name
复制代码 ; I: k- k' ]6 A3 b# A6 A
5 O* \/ W+ b; D! k& h5 c |