Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
, l5 c% r6 W$ _' Q4 T8 I- #!/usr/bin/env python6 s( V. V( a1 o. F: E
- # -*- encoding: utf-8 -*-; Q9 T! k, \2 S
- # Created on 2019-05-05 21:43:11
' y8 o! V) k9 k! a9 n - # Project: XiaoShuo
" l) ~9 l6 S. {0 ~) I: n$ { -
1 d$ K8 O1 I& c/ `$ z, X9 r - from pyspider.libs.base_handler import *
6 W" s, Z/ e" ^6 S& ` - import pymysql
( N# N X! p9 B% m) {% n - import random
! e8 \' E2 r: m0 L - import datetime5 b) \; y$ P, e9 S& G4 d/ z
- import urllib2,HTMLParser,re% k3 q Q6 J6 q. R
- import os
) C6 R8 \* P8 \$ F' M9 } - import sys
0 t- d2 x" g2 a5 b - import re
% R( Q4 V( v1 i/ E ^- Q4 Y6 ] - import codecs
" s: y6 p/ d$ V/ n4 d8 w" N$ E - import requests
3 k: O6 F8 y6 d' x' G - import json8 `0 C& ?; j, V% ]4 P5 X
-
) ]. z2 J; s3 W) t" w - class Handler(BaseHandler):- Z% F0 `$ t" Z- z& M
- global Datos( N4 a5 |$ S. V( L3 Z
- global P_dir 8 `0 B# M# c+ Z
- P_dir = '/Tools/Debug/' #采集时候图片保持到本地的路径4 F E: U/ Q Z2 e
- global Datos* R, V) g" x: q4 H( s
- Datos = {}
) X' V6 b$ A9 X% Z' @ - headers= {
' q; J6 W ]6 _6 P% t6 n+ z# l( n - 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
. Z, }* u6 d7 U6 ~. V - 'Accept-Encoding':'gzip, deflate, sdch',4 n5 ~6 ?$ q+ g6 B# w3 a3 k: l
- 'Accept-Language':'zh-CN,zh;q=0.8',
+ P$ G( O; \, n1 a# N; _ - 'Cache-Control':'max-age=0',
2 H& p! W0 `+ Y" z# _! ^; o, z - 'Connection':'keep-alive',
' b& A$ q3 a/ Q6 C9 e& ~5 Z( K - 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'
( N8 Z# `" [- {! }3 k - }9 ^5 t2 y, {+ c b j2 h- P* t2 W
- crawl_config = {
0 Q( K7 D; V; a9 M) Q3 O - 'headers' : headers,+ k3 h: M0 Q$ s s% K9 w4 ?, W
- 'timeout' : 3007 }0 d8 J" k. z4 W
- }
1 ~1 i9 Z/ [2 s. Z7 ?% a - def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):$ t- T- w- j% P$ ?
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
}+ t( U3 Z7 V6 g% i; F" i - try:% x m5 t/ x: k* u* t3 l
- cursor = db.cursor()
; H! q+ x& K3 Z7 P - #注意此处字符串的占位符要加双引号"%s"
+ C& P4 @& ?( l3 Z! Y: f# D0 y - sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);. |* [& }- M2 X% J
- # print(sql)3 B# j% l, y; u
- cursor.execute(sql)% }1 z( q% D4 C$ Y' l5 R) Y- P
-
3 p$ z: L1 a [ - #qid = cursor.lastrowid+ L5 {+ g6 G9 H" C
- #print(qid)
( p, i9 S" |2 j0 g' k- T% U; N8 ` -
( y, Z* D, S1 ^ - db.commit()
* u, o. J0 J$ b1 n - except Exception as err:/ w# i0 Q4 _. u" |7 C
- print("Error %s for execute sql: %s" % (err, sql))+ q+ w: { k; ?7 E( N2 z0 v
- db.rollback()
/ V0 {# }! r0 G" Z5 x4 j1 k - def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):: P, R& W" `. Y6 Z, V" A6 X
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
6 w% e2 ^2 U, B y" o - try:
& y# a; W6 Y. I; f" P6 J8 O i - cursor = db.cursor()
' @0 b- _6 q5 r% _ - #注意此处字符串的占位符要加双引号"%s"& W7 D" K5 U; W
- sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);- { [2 j" O4 ]( E5 n
- # print(sql)
0 l" a) w8 g4 a. c8 D" w. [ - cursor.execute(sql)
/ a) ]0 g* }# d8 f) m& t7 l$ B( I' c - u8 j/ n; I8 I, |
- #qid = cursor.lastrowid1 {2 j! J& J X v. f. P8 s' ^! x
- #print(qid)
: B6 O) V8 O4 Y8 z4 h9 { -
& u6 v: b* G4 w% Q - db.commit()
( V3 Y' G$ g! c, [4 U/ e5 ^ - except Exception as err:: C" a- m& b+ x/ O
- print("Error %s for execute sql: %s" % (err, sql)); ^' B* F, z' E: @' Q
- db.rollback()# V% u6 V1 S" E6 P: K, }7 p2 A
- def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
9 L8 I2 Z- E- G; Q - db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
( ], X2 ^/ Y w- o* n - try:
! @8 ?0 |; F: @% |( l - cursor = db.cursor()
) Y/ e# G) N, R7 M& L; G1 y s e" \( B( r - #注意此处字符串的占位符要加双引号"%s"
1 p0 j- \3 r% u( s/ o' w - 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);
2 k. _7 f4 b) H3 A- o" F: o4 Y3 p! X - print(sql)
0 S& M+ h% b) V8 G( z8 W9 Y* t; ^* Y7 j - cursor.execute(sql). @8 y- T6 n" S8 Z; [
- print(cursor.lastrowid)4 E1 P$ S% ^3 R
- db.commit()
6 u) z# i* R/ C2 |" k1 w - except Exception as err:+ b7 D. j, l2 Z) l5 e
- # except:
5 r8 ^0 g' F* R+ C5 Z - # print('Failed')* J$ j& ~3 X% R
- print("Error %s for execute sql: %s" % (err, sql))1 m4 w8 ^( X5 t) ~
- db.rollback()/ L7 S1 ]' ?0 z! j6 ^
-
; i3 U. Q g: F: S( q' G - def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
) G! ?/ Q/ A: M7 N. Y% R: i - reload(sys); K2 o4 s" u6 d- d y
- sys.setdefaultencoding("gbk")% ^# g( y, a0 h. {* P, D
- locoy_url = 'http://www.******.net/locoy/?my=book' #697火车头发接口地址
+ w6 L8 X4 l, U0 V5 P/ D - locoy_data = {
! [3 C2 j% O& K; ^* o6 e - 'my_u':'用户名', #后台用户名# w. y9 ?% N a! ?" a* l
- 'my_p':'密码', #后台密码
3 O# L+ ~% @* [- y7 N. f- e - 'subject_669977_net':Bookname.encode('gbk', 'ignore'),
# k* R9 T. S: T: U( { - 'caid':Cater_Name.encode('gbk', 'ignore'),( E2 q- N# h' K0 Z7 L
- 'title_669977_net':Booktitle.encode('gbk', 'ignore'),
M1 L# h$ n0 q! u( L6 `/ ] - 'article':BookConte.encode('gbk', 'ignore'),
' h0 J8 h& x! N+ `" w - 'author':Book_author.encode('gbk', 'ignore'),
0 [5 d' y9 p* N E" q1 \ - 'ready_1':Book_Palabras.encode('gbk', 'ignore'),8 n8 X/ N; t9 W L: q" H6 i
- 'thumb':Book_img,
2 z, J, Q1 L7 w" J" U - 'content':Book_Introduction.encode('gbk', 'ignore'),8 q4 r" J9 y0 |
- 'abover':abover.encode('gbk', 'ignore')
+ n5 m3 R4 c+ S5 k8 N- \- C - }
# q" U7 Y9 @3 E) o3 X8 F( E - res = requests.post(locoy_url, data=locoy_data)$ b; \, T# w1 d( x7 D, U2 W) \
- print res.text& q1 U2 O( H7 I. a: }
- print res.content
0 q% P+ m- {: z, D( @1 E - # print Dsd# J* V% a& I& `' P
- return res
R& G2 M6 M1 U( I% T -
# ~+ k7 U" i2 r# u) I$ Z2 X - def __init__(self):9 L* ^0 Q1 \- {1 Z
- self.base_url1 = 'https://www.****.cc/'
3 U" [+ d7 Z6 N) J6 _* ] - self.base_url2 = '/'/ a1 J# Z0 y ] {/ X' w' g% ?
- self.CaterId = []
6 c% M* ?/ {, p# Q! Y: W) f$ U - self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
+ O3 }; F. U: u Z2 W$ n) V+ c0 } - self.page_num = 1
9 o$ Y( C9 P3 ?' y, n - self.total_num = 200 . m9 F% \2 j3 ~' n' m
-
7 O6 x+ V4 k ?6 W - @every(minutes=8 * 60)8 u2 X4 J/ B% F6 c F/ o
- def on_start(self):
; i0 B: X. f" Q* I& O9 ^ - global Cater_Name
1 k6 Z4 _$ Y3 {4 g$ u - Cater_Name = []
3 Q# Q _5 x) o+ c7 _% I( {8 G - while self.page_num <= self.total_num:
' g/ J/ [* Y& |2 `- ?6 Z( f - for self.CaterId in self.CaterIds:
1 v, S' p7 x1 l" k, e1 ` - if self.CaterId == 'xuanhuan':
' ^/ p- }3 n8 U" E3 f. d - Cater_Name = '玄幻'
# \% `. t0 I# a% C1 Q1 r6 H6 C. U - if self.CaterId == 'wuxia':
( T% c' O" K/ l# B1 N! I! W - Cater_Name = '武侠'; r' }5 m5 t% r7 S M) s* _
- if self.CaterId == 'lishi': B( @- I3 r8 e5 T+ a/ q
- Cater_Name = '历史' " X2 o$ ^% J$ C) Y
- if self.CaterId == 'yanqing':
" \% X5 J7 }/ N, w1 s4 c - Cater_Name = '都市' , o1 u8 \& V7 c
- if self.CaterId == 'nvsheng':$ b, @$ z. T# L0 z( ~& V3 E
- Cater_Name = '都市' ! `! g" N2 q, M* ?
- if self.CaterId == 'kehuan':
' @- N% V' R6 B - Cater_Name = '科幻' / r5 Q6 b1 l2 n9 I$ h
- if self.CaterId == 'kongbu':8 O9 j1 z: z$ d% `/ G9 C3 ^
- Cater_Name = '游戏'
' d. t9 I4 p8 G/ ?+ G - print self.CaterId: a, ?. L( l' {. t2 J+ S% f/ W
- url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"
& L7 `0 M& l, r1 c f- m - self.crawl(url, callback=self.list_Caterg,save=Cater_Name)% f0 |* M p/ Z& P# @
- self.page_num += 1 1 `6 P5 P: g+ S6 [$ Z2 U7 r/ w
- 1 I4 W1 m' B6 u5 p$ {
- def list_Caterg(self, response):
# g# a( P- [5 ? D! b; c, ~/ T4 P3 x - Cater_Name = response.save
. p, w: z- R8 X! ] b2 s( W5 m+ a - for each in response.doc('.pic-list a[href^="http"]').items():0 b0 n5 @3 N- I% g& F( B) p# O7 n
- self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)" |" k+ C7 X, Q4 _
- & `9 `: V$ D* o. N; `
- def list_Caterg_detail(self, response):6 p* G# K0 e" Q
- Cater_Name = response.save' f: L9 K2 w3 K9 N2 L: R7 r
- # print Cater_Name
% N/ a4 X3 S* A" I - Bookname = response.doc('h1').text()
+ @1 ?& n& }7 M - print Bookname( b# r8 B& h* C6 R% x; K7 h
- Book_author = response.doc('.authorname > a').text()
. n, ~5 _" Z% P" t/ V - # print Book_author
) p4 c8 }1 o( X6 x - Book_Introduction = response.doc('.book-intro > div').text()
" \4 p7 H- C8 ?) _# D; l4 `3 @ - # print Book_Introduction, t! {- X) f" H% F' u# o. l
- Book_Synopsis = response.doc('b').eq(1).text()
' Q0 o! o7 R/ I6 c2 A5 A& e - # print Book_Synopsis
1 ]. D8 I( O4 y6 e4 w( ^) O - Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]6 Q* t! y" f v8 D r0 l* k7 H
- # print Book_Palabras
5 Y+ X1 G9 d( n& s3 V - BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0] #小说ID
7 M3 ^: S" X B; R9 Z4 }7 j) _$ s; x - # print BookIDs
$ v" @# m" ~& y) @5 Q - Book_Dates = str(datetime.datetime.now()) 0 C: h) l; D2 Y1 d8 o
- for imgs in response.doc('.bigpic > img[src^="http"]').items():
+ \! @' b# r" o2 z. I - img = imgs.attr.src
8 ^/ E K9 W$ Q - print img
& Y8 ^, {( y. ? K- r9 A - #小说封面下载, S4 g0 F; b+ _' z( z% Y
- extension = self.getExtension(img). Z& e: k* ?1 r" q) f
- name = self.getname(img)$ ^. L1 p, x/ {) k1 a
- file_name = name + "." + extension
. P7 S! \! q# I- e0 N s - imgDir = P_dir + name6 v8 c8 `4 K3 h
- Locaimg = imgDir + "/" + file_name4 Z, S) a: Y; N! H5 |
- print Locaimg
) W- z0 \, D- z9 v- R# @ - if(self.download(P_dir, imgDir, file_name, img)): #这2行可注译,图片下载到本地
% i. X' ^% d [* K: o2 @0 U - print('attachment url is ' + img) #
- O0 r% O" w! H' V# F - Datos = {5 a- J. X- ~8 o+ C* _0 }0 ~
- "Cater_Name":Cater_Name,
% \/ P' y5 Z7 k - "Book_author":Book_author,
: ?3 h o5 L0 w9 ~ - "Book_Introduction":Book_Introduction,
, Y! u7 b& ?- c% C: C - "Book_Synopsis":Book_Synopsis,
; S% Q ]* `. K1 j7 n* X* c, P) A* C - "Book_Palabras":Book_Palabras,
) L, M; S3 o- U( o% p) l; ? - "img":img,
8 c; j3 Z, y7 j8 k l J& r4 m - }% P5 T5 v2 X! V( I: ?
- self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates) #这行可注译,数据库发布接口,方便其他系统的发布9 k% Q' ~2 @7 q
- for each in response.doc('div[class="bookbtn-txt"] a[class="catalogbtn"]').items():
0 f! D' I* M6 D0 h - self.crawl(each.attr.href, callback=self.index_page,save=Datos)
: j3 i* N1 R6 L2 b/ g -
0 f- e9 b5 R& P. S - @config(age=8 * 60 * 60)
0 ^5 F- D. c& B. n9 F) l) R5 d - def index_page(self, response): * u x j1 R/ R+ }+ K# u# X& }
- Datos = {
& Q3 V) O i" O+ t; P- g' ` - "Cater_Name":response.save['Cater_Name'],& T2 G+ D4 f: ~% u! Y' W$ o
- "Book_author":response.save['Book_author'],
! d, j- g8 C) o5 @* I& Q - "Book_Introduction":response.save['Book_Introduction'],
; |% B6 v& K1 z0 v9 Q& u - "Book_Synopsis":response.save['Book_Synopsis'],
~% Y. t% e+ [5 E/ ~$ X - "Book_Palabras":response.save['Book_Palabras'],+ S- U5 Z2 Y& b% }7 |( f& x+ o( T
- "img":response.save['img'],* k- x% g( b6 {# l! M. G
- }
1 j- V. K/ v. U3 A3 r - for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
6 a* J* m8 m5 I0 O - # for each in response.doc('.chapter-list a[href^="http"]').items(): ! u3 |4 @3 I$ L, }2 F9 p+ w
- self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
2 h5 l8 l: r( s0 D/ G - @config(priority=2)8 l$ m% o' L% f& V0 m" V* ]
- @catch_status_code_error
3 I& |# E; d% z4 B5 D; K* H3 l - def detail_page(self, response):
" D4 G& v) @( s - NewRe1 = u'哈书', f% L2 V! h J: C4 O4 j: P
- NewRe2 = u'huhjsd.CC'9 M7 c: Y; a9 u- g! r% p
- NewRe3 = r'^\\n\\n'2 |" a8 @, I0 j
- NewRe5 = u'小说网'% Z5 b5 N6 ~ s* `; }; R
- NewRe6 = u'fgdfgf'" n z, J6 d0 ~; S. N
- NewRe7 = u'fgfgf'
: B5 C( a6 } R8 ~# G - NewRe8 = u'ffhgf'6 y9 Z( z) K. i- @4 Z: G& {
- NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'1 {: O: q$ J# C2 h5 ?. A
- ReC1 = u'静思'4 C3 ]: h# K( ~6 ^
- ReC2 = u'aghgf.com'& h; R" {, z' G# H
- ReC3 = u'aghgfh.com') k% f9 H1 C' m" l# G" L
- ReC4 = u''
# R, ] w3 s4 P7 A, s% T: ]. d - ReC5 = u'文学网'
4 P' r' U4 }7 f - ReC6 = r'<BR>'
% S, a/ `/ e- } - Bookname = response.doc('.readlocation a').eq(2).text() #小说名称
% S) n+ q# G) { - print Bookname" i4 Z( s* x( e# Z& S
- Cater_Name = response.save['Cater_Name'] # 小说分类. C/ M( d9 i/ b# B( p
- Book_author = response.save['Book_author'] #小说作者1 a- h' A$ r1 v. w% T8 c
- Book_Introduction1 = response.save['Book_Introduction'] #小说简介: C! G0 K6 D- y6 j r
- Book_Synopsis = response.save['Book_Synopsis'] #最近更新% h: y# L- H. [/ c3 W. V. q; D
- Book_Palabras = response.save['Book_Palabras'] #小说字数
" N+ r8 |$ D* m9 d2 y3 a( \( _( ^ - Bookurl = response.url #小说网址6 c$ Q8 X% t# G- T& i8 x1 |0 _
- Booktitle = response.doc('.article-title').text() #章节名称
! K, q7 y; U( W. o* n* k: ]: f/ A - BookID = response.doc('.readset-r span').text() #小说ID
( P! U+ o* p: H) v2 Q0 d8 Z3 Z - BookConte1 = response.doc('.article-con').text() #小说章节内容
# w K( W4 c* \4 k+ Q) X - abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction'] #小说状态(连载还是完成)1 ?. I% {. @: u' A
- Book_Date = str(datetime.datetime.now()) # 采集时间! s& _$ l- ?3 _3 S, Q# B
- BookConte2 = BookConte1.replace(NewRe1 , ReC1)
9 E3 w4 J" I6 T, h P - BookConte3 = BookConte2.replace(NewRe2 , ReC2)
) W/ S' P5 w7 u2 s) A% ~ - BookConte5 = BookConte3.replace(NewRe5 , ReC5)
$ @8 h) U" @8 g% Q4 i - BookConte6 = BookConte5.replace(NewRe6 , ReC2)
0 m Q) v8 y3 R9 k - BookConte7 = BookConte6.replace(NewRe7 , ReC2)
% L k& y" s3 i- f Q - BookConte8 = BookConte7.replace(NewRe3 , ReC6)
8 ^. w7 ]+ ^) R - BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
3 \+ H* j* [( ~4 k( }/ Z* r - BookConte = BookConte4.replace("\n\n","<br>")( V2 H6 O+ R" \# l
- print BookConte
2 v0 w6 c; [. Q( j6 R* C0 l - Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)8 _4 ~! w9 I1 m9 k
- Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)( M9 G+ o- g2 A. U" W! Q( K
- Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
' S% a F$ @9 j9 _4 [4 g$ i$ N9 R - Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)+ j9 L) \7 D E/ Q
- Titleid = response.url.split(BookID + "/")[-1].split("/")[0]
% `& C# h o9 L4 K* }* Z - Book_img = response.save['img'], #小说图片, O2 E% j2 ^ R- q! d9 S
-
; I& P% O2 x( E; z: L" f5 o - #insert into MySQL 小说入库
2 e# `9 \( D( g' Q2 w& s - self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布
* c, ]& e, b( R$ m9 c - self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布
* ^( y2 g6 }+ `+ m# E& h. b5 S - #post提交发布
9 N* M) }' f3 y. z0 h - self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover) #这行可注译,火车头发布接口,不需要可取消
" c8 e) t1 k, c! o1 F% S/ b/ E - Datos = {3 W( @ E2 y* X3 x# N$ \, \# `
- "Cater_Name":response.save['Cater_Name'],
4 g0 u) r {/ {# b6 f2 q; p$ V/ q, X - "Book_author":response.save['Book_author'],
" a) F( {8 N |6 p7 I7 y - "Book_Introduction":response.save['Book_Introduction'],
: l( C; q4 W" |; L - "Book_Synopsis":response.save['Book_Synopsis'],
; i5 l7 [3 @, Z/ m6 i - "Book_Palabras":response.save['Book_Palabras'],- q' \0 R8 l/ I, I
- "img":response.save['img'],0 ~& c+ M( s% a6 d# B& h# y$ Y
- }
' b% J3 t N; s) [/ a - for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
( H. p; D2 \) q' t: R% G' | - self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
" l# q/ o- s( ~0 k) r - return {! k5 w3 ^5 [; C& ~
- "Cater_Name":Cater_Name,& r3 u+ l L9 |: B) W2 D
- "Bookname":Bookname,
) j2 h, @7 ?: }0 s! \7 B - "Book_author":Book_author,' l9 X# E, U7 D* M" ]
- "Book_Introduction":Book_Introduction,2 k5 l! f6 L4 u* o9 N" C
- "Book_Synopsis":Book_Synopsis,
# l$ A, `; N" R8 c7 O' N - "Book_Palabras":Book_Palabras,
$ D/ }% a2 K1 A) B - "Book_img":Book_img,
; Q( c/ H) m. w3 b+ V3 D z" ]. ^ - "Bookurl": response.url,
' s, \% c, k0 C( Y3 H/ b - "Booktitle": Booktitle,3 S! u$ r* @+ ^
- "BookID": BookID,$ q3 V+ E* x( x. w7 n# t2 B" @
- "BookConte": BookConte,2 c* X, K2 [7 q0 E* ^, \+ r
- "Titleid": Titleid," q/ u5 ]6 | ~/ U. R3 d: n
- "abover":abover,
7 u' Y* o6 ]* j/ f. F' J: m% q - # "Book_Date" = str(datetime.datetime.now()),6 y6 |4 E+ R0 u1 m: o# n+ p
- }
1 _8 ^0 t9 D) Q; K, \1 e I - def download(self, P_dir, imgDir, file_name, Book_img):2 Z& \4 r' u- i/ [
- if not os.path.exists(imgDir):
9 C& U; t& X8 V8 g - os.makedirs(imgDir)7 D r" ?* x G! x9 J
- file = imgDir + "/" + file_name' X1 R9 V& f/ t, `& X. j8 T! d! W
- # print file2 i/ d/ U, U( \) M+ O. ]
- f = open(file, 'wb+')
( Q) n4 \2 \4 q6 C( V" m2 v - imag = requests.get(Book_img) ( t# o1 l* V8 l: D4 O, \+ t1 M! g5 P i
- f.write(imag.content): ^2 k9 @ j& k$ h9 c
- f.close(), u/ f# _; H1 X3 g
- #保存图片前5 ]% h8 D; [6 W
- def save_imgs(self,response):, M. ?# i A6 ~6 t- E# @! t' I
- content = response.content
; |# n3 y( P% o: T* H - file_name = response.save["file_name"]) `- a) L" i) T: K
- imgDir = response.save["imgDir"]) b; W' D+ F$ E4 A# T" |
- file_path = imgDir + file_name) M) k- N7 {3 t, R" p
- self.save_img(content,imgDir,file_path)1 Y; V$ C; ~4 o
- #保存图片
: G+ p3 }; f4 p" u' M - def save_img(self,content,imgDir,path):
0 Q! g& p8 ^8 S( a& m) t( o% m* ? - if not os.path.exists(imgDir):
; F5 N, I& [; b7 e4 ^ - os.makedirs(imgDir)
- {# B0 r B5 I# q: u - f = open(path,"wb" )8 t/ c7 J: a- S- {' ~
- f.write(content)
8 l/ L5 |- o9 ^/ O - f.close()
& ?3 g( C3 M$ r% v. b" P8 T - #获取url后缀名
- I. X9 Q z3 T& e' C) q - def getExtension(self,url): # I8 |4 g& ~( l' U! _6 X
- extension = url.split(".")[-1]4 L' `( d7 P* l* N
- return extension / T8 J: R9 j3 E; h B
- 1 s- c$ Q- i4 b# G1 O- H
- #获取图片名
6 @. |+ e: d& O7 I - def getname(self,url):
- K3 n1 E+ P$ {) E- x& J - name=url.split("/")[-1].split(".")[0]& ]2 v" ^0 r8 L
- return name
复制代码 + l! L, h @7 w* K: K; C4 }
5 d4 f6 T# d2 r% w! P |