Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
/ j0 s, Z+ v# _7 X% z- #!/usr/bin/env python
) x! \% z9 _, n: ^ - # -*- encoding: utf-8 -*-
" B1 F, k, j! ~ - # Created on 2019-05-05 21:43:11+ I; X4 u1 |9 _" Z* r
- # Project: XiaoShuo" `( _* Q; ~% r4 Q. X
- % Y0 G" }; G% m
- from pyspider.libs.base_handler import *
?+ m4 v+ ]- `9 Q6 ~- S' t - import pymysql6 x3 F0 \. ?- i; g
- import random" F5 z; V$ L9 z2 e( F
- import datetime0 V# o, m" p: T9 q4 F \/ E
- import urllib2,HTMLParser,re6 Z, K( M; ^/ q. e5 R
- import os
3 @, A, K, e9 n0 b - import sys8 F0 K( L& J. g& H
- import re5 A8 x* d. A( U
- import codecs( l! v3 l! z4 P' d
- import requests
0 I8 E- `, v* t3 d - import json9 C7 v- A% l9 Y7 [8 q: z
- / @: K' }# T$ v5 g$ t& }
- class Handler(BaseHandler):8 z+ v2 N. j* o% N0 _( }
- global Datos- `9 }( y- t+ G: E# y
- global P_dir
1 }& Q B: |& ]5 I3 _# n - P_dir = '/Tools/Debug/' #采集时候图片保持到本地的路径
$ {0 C# k+ _8 z& ~& t! e - global Datos
" i. s. Y: n; b1 [, H - Datos = {}% W y$ B. K1 J3 R# K& D% Y4 l
- headers= {
7 \8 p6 \9 ?" P( \# y# c - 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',- L l; h$ O) H0 r0 `
- 'Accept-Encoding':'gzip, deflate, sdch',
3 u2 q/ D; o6 X8 G - 'Accept-Language':'zh-CN,zh;q=0.8',7 R8 W- V9 p! z/ z9 u
- 'Cache-Control':'max-age=0',
9 r8 x. o! ]. ]; {0 { - 'Connection':'keep-alive'," w2 H/ K& ?/ X6 {: ^ M# D
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'7 E) Q" ?7 J0 U9 |! K) A: b% n
- }& c3 M6 q0 K6 }: ~' X/ r
- crawl_config = {
1 p9 `/ U8 @: c* f3 d" f* A - 'headers' : headers,
% v4 S4 W( A* j$ H/ q - 'timeout' : 300
9 L6 l+ z) p( Q T% L" u2 }# e - }
; L8 v4 F* o& T* e( N& W8 e - def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):0 Y$ j- T, F. M) q' Q: ]
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")+ ~! ?& g9 o: N# Q
- try:9 k& x: b* q3 X' w5 h; G1 c' R# B
- cursor = db.cursor()1 x/ m$ h$ \' [4 h$ [
- #注意此处字符串的占位符要加双引号"%s"6 x7 r( a$ R- u3 V7 |+ g
- sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
2 f( |7 q% T: h1 T" @2 o! j - # print(sql)
2 L2 {" X. L! } - cursor.execute(sql)1 x5 i7 c: ]% U* g% f1 ?2 ?. b
-
6 M: t# J8 ]2 y9 {; f6 O r" u - #qid = cursor.lastrowid w! z' \1 e" @: n
- #print(qid)- N/ X# ^( a. j+ N: b
- ) K T2 g" U1 Z7 x: ?
- db.commit()
% Z7 W& \; g7 | - except Exception as err:$ V# `- }- @5 r: y; O, n% f
- print("Error %s for execute sql: %s" % (err, sql))% s1 _0 p; n6 s- t# s
- db.rollback()
/ B2 o9 y- c" ]8 ]0 U" ^8 g - def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):& A% }6 ?+ @+ ^1 d
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")6 t. T, k8 W1 M0 U8 l, D" U
- try:
8 N& Z S/ w1 I3 X& W$ s! E# Y! q8 h - cursor = db.cursor()
% z! w7 k, s% q4 {' S - #注意此处字符串的占位符要加双引号"%s"
# K. _- E! a0 e - sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);* P7 Q+ {# x @
- # print(sql)# p& ]" Y: h9 a; }6 l8 A4 ]
- cursor.execute(sql)
`% Z* ~7 [9 v, y0 q - - u2 u1 u+ e6 v9 i: u
- #qid = cursor.lastrowid
1 F: |) J5 t1 o9 | B - #print(qid)
: s# E" |( v$ ^8 T! c8 X9 p& J -
4 i( d( J+ _: ]+ y$ _# [ - db.commit()' \' t( C' W7 X+ p6 w3 E
- except Exception as err:
( Q% X( m( ]% ?) {8 g2 U - print("Error %s for execute sql: %s" % (err, sql))# f( F G5 p) u) i4 ]' P5 @$ \3 x
- db.rollback()
+ G/ v4 ` B- x% \! }4 m( g - def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
) ?3 i4 s# l b" O2 d - db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")8 i: {$ n! v L! a/ l
- try:- J* e2 R! R! x5 [
- cursor = db.cursor()
- U& d4 }$ Z! @5 {9 T* D - #注意此处字符串的占位符要加双引号"%s"
: F0 p' D1 n- \ - 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);' J) [! Y& X. p2 Y, b) i+ M
- print(sql)
: x+ h' g) X9 i. C7 _5 T - cursor.execute(sql); S: h" x: H. F' {- p2 `6 G! u# G
- print(cursor.lastrowid)
1 n+ a8 _" H3 K) q - db.commit()
7 m N9 G2 L, b! r" T - except Exception as err:/ H0 R. Z2 F) ~0 t1 F; e o/ M
- # except:
& b6 ~; H) L: ~+ }8 c - # print('Failed')) t# ~3 G. z+ ?4 L
- print("Error %s for execute sql: %s" % (err, sql))
& o; H$ w3 p2 q' P - db.rollback()
/ K2 c. ^* P2 M: d3 x3 t -
3 u9 t) T$ C2 h- n8 d7 k - def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
! n5 {8 A# g! R3 ?' W# ^ - reload(sys)/ U$ _! E: e+ l1 q. D3 h
- sys.setdefaultencoding("gbk")
" l6 p9 W: O/ { J" ^7 \ - locoy_url = 'http://www.******.net/locoy/?my=book' #697火车头发接口地址7 U0 a" B5 t( a1 k9 b& a
- locoy_data = {
4 C* z* S1 K& s$ ?8 v( ?% ?7 [ - 'my_u':'用户名', #后台用户名
& W; n( J: U6 i" n8 ` - 'my_p':'密码', #后台密码5 _( N& q: s5 i D$ ~! m" f
- 'subject_669977_net':Bookname.encode('gbk', 'ignore'),+ \" }2 a( ]8 m2 a# M
- 'caid':Cater_Name.encode('gbk', 'ignore'),
4 A6 L9 O& [: p' @* W" N. w' h - 'title_669977_net':Booktitle.encode('gbk', 'ignore'),+ f- l! S( r! t4 h
- 'article':BookConte.encode('gbk', 'ignore'),2 S {* ~& }6 ^0 c5 v, r
- 'author':Book_author.encode('gbk', 'ignore'),
+ X1 C4 ` u, i( h - 'ready_1':Book_Palabras.encode('gbk', 'ignore'),
( U3 x* X, \0 p' _+ R2 Y - 'thumb':Book_img,
! w. C2 l' n+ w0 W5 _2 C - 'content':Book_Introduction.encode('gbk', 'ignore'),
; J& N; C: W3 k5 m - 'abover':abover.encode('gbk', 'ignore')
+ F4 \- Z% W) K! U9 p - }- t- O- `3 t1 f+ |- s# J4 G
- res = requests.post(locoy_url, data=locoy_data)* Q! @- n, q5 E, t; _! ]3 O
- print res.text; d) y7 z; L( Z' a0 v
- print res.content9 {0 F6 i$ I0 j- f* ^2 {
- # print Dsd
% V7 y* m9 x: W! k' h - return res6 h/ U7 m F6 X
- ' Z! A- d7 f9 g$ ?6 }2 Q: |
- def __init__(self):
+ u3 r& q) \7 x8 \4 g0 r, \$ K0 b" @1 ^ - self.base_url1 = 'https://www.****.cc/'
$ ~0 v8 I1 h8 h4 S - self.base_url2 = '/'
9 E! S! D) y3 \6 v - self.CaterId = []
( w7 f5 h( H H0 z - self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']* L: L7 b' X! Z. m* |$ s
- self.page_num = 1
7 p6 k) V% ~, }/ q - self.total_num = 200
7 E: K {; Q4 A$ L7 h - 6 a! }! y0 `( K
- @every(minutes=8 * 60)! r ]# b4 w$ j" y2 s1 |
- def on_start(self):3 ~( X9 w& _1 r1 p- P1 b' O7 N) c
- global Cater_Name
2 T6 I* }2 F" k, M: K' x - Cater_Name = []* B6 O' L1 t. n$ {; c
- while self.page_num <= self.total_num: 8 Z0 N s% X f4 e* C
- for self.CaterId in self.CaterIds:$ b0 T7 y4 p* Y( L+ K
- if self.CaterId == 'xuanhuan':+ H3 h2 V" _, C- f: ?$ }
- Cater_Name = '玄幻'
/ I% |9 B8 f* m6 s$ x - if self.CaterId == 'wuxia':: l2 Z% k2 ]8 X' |7 W8 Z. L. y! C! i
- Cater_Name = '武侠'
$ H5 x, h6 n6 T! A - if self.CaterId == 'lishi':
% |, p% ]. S: [/ ^! D - Cater_Name = '历史' [4 K, ?/ d9 g( h. g2 U# Q
- if self.CaterId == 'yanqing':
$ ]8 O/ Y' j6 J2 q4 n! S; f( n7 @ - Cater_Name = '都市'
/ D" Q) n, |9 B2 { - if self.CaterId == 'nvsheng':( T( V4 G# V3 f) |) c# B& a
- Cater_Name = '都市' 8 l6 t+ I( Z- M! N( z! s
- if self.CaterId == 'kehuan':
$ ]8 U# s) S* l, A: t - Cater_Name = '科幻'
, P' t0 g5 U7 U, j" O - if self.CaterId == 'kongbu':. C1 h! F( D: a# O6 t/ x* z
- Cater_Name = '游戏'
o/ w5 k/ N# w. ~, E2 J! P - print self.CaterId! i A. T7 e% a% m" k0 P* T3 R3 R
- url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/" 3 i5 a( J6 a; G8 F, A# C
- self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
$ n" [7 ~2 q, C - self.page_num += 1 2 w% l( a& P! w a5 n5 `8 t
-
8 ^- \ d d5 B# O$ s8 g0 i - def list_Caterg(self, response):
8 W* c: u1 s# U$ S2 D" P+ H, t/ n - Cater_Name = response.save
. r( ]( u* B, X; Q( X# `" x! `( ~ - for each in response.doc('.pic-list a[href^="http"]').items():, B: o. D0 q4 [4 @& P9 F* {1 _
- self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
1 x1 t& k1 R! N% t2 f -
, `: a d& F3 I: Z; I2 { - def list_Caterg_detail(self, response):
4 D2 x" o# p7 d - Cater_Name = response.save
1 Q6 p$ ~ V# J6 K* N- S# [+ i$ a - # print Cater_Name
D' R' g$ V, {1 k' p m - Bookname = response.doc('h1').text()7 L! b# |' w; f9 b" u- a9 E' F
- print Bookname
9 U! O8 a) N/ K4 n. k& b - Book_author = response.doc('.authorname > a').text()
# ?2 K( k4 b5 B# N; } - # print Book_author5 F- n. c! N# L
- Book_Introduction = response.doc('.book-intro > div').text()3 e2 R- v t1 \6 j, F i$ }
- # print Book_Introduction1 X! O" c3 }* o$ \
- Book_Synopsis = response.doc('b').eq(1).text()
4 y1 o C! K/ ^, V; J( J/ k1 E6 t - # print Book_Synopsis
" g6 v' F) o, }- A" A0 d - Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
4 v$ I! J4 @5 U; J) I/ V3 b - # print Book_Palabras- A4 |7 b# ]0 b$ z* F9 B1 Q; A% |# R
- BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0] #小说ID: H( d7 o. w$ N* f7 P0 R
- # print BookIDs
4 o: {; d4 r, H$ D: G* J$ y - Book_Dates = str(datetime.datetime.now())
" Z9 y0 {, ~+ f5 p- A, g - for imgs in response.doc('.bigpic > img[src^="http"]').items():
% k) \8 \0 i3 M- E - img = imgs.attr.src
! w5 s0 S/ w- f7 e' @1 q - print img+ {8 `4 {0 m: u3 m8 O% `: q
- #小说封面下载
1 I. X' z2 t# W - extension = self.getExtension(img)
% Y% w% [$ |/ N$ l - name = self.getname(img)
! o: c, [2 ^/ y" g/ e - file_name = name + "." + extension
7 R$ m* q& I6 K% a' F4 O4 g2 j6 @ - imgDir = P_dir + name
7 j/ H# S$ Z0 A* U - Locaimg = imgDir + "/" + file_name
' k8 l3 U6 R7 `' D D - print Locaimg# M$ V) F7 [1 Q. n5 w
- if(self.download(P_dir, imgDir, file_name, img)): #这2行可注译,图片下载到本地# L( ?% v" ^6 @* z- j
- print('attachment url is ' + img) #
3 h; T5 q8 M/ t! ~1 h5 d - Datos = {
3 Z1 k& B' D5 t9 V1 i7 g) f - "Cater_Name":Cater_Name,
. y+ g' G3 ~6 s1 Q, j; ?/ H! B - "Book_author":Book_author,
, W' t+ k4 p$ i; X) O1 K& w - "Book_Introduction":Book_Introduction,& c7 y9 R6 P6 G1 i) S5 }
- "Book_Synopsis":Book_Synopsis,
1 y% y5 a. f7 [+ B - "Book_Palabras":Book_Palabras,
+ r( o6 c' G* D$ H$ G - "img":img,; A6 m& j+ ^; n/ s. d! s9 w1 k
- }
6 @8 b$ ]6 E. n% V- a- C% @ - self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates) #这行可注译,数据库发布接口,方便其他系统的发布
+ B% @% T3 Z9 h9 f' q4 H3 x( e: B - for each in response.doc('div[class="bookbtn-txt"] a[class="catalogbtn"]').items():
. S' K# V8 r! I4 K. u - self.crawl(each.attr.href, callback=self.index_page,save=Datos)/ H& x G" d* ?
-
) b5 s( o* {4 X- v - @config(age=8 * 60 * 60)
$ U0 O# z U% _7 \$ n, |# B - def index_page(self, response):
8 e) @7 i4 K N' z4 g1 c - Datos = {! I, h% s# H3 T
- "Cater_Name":response.save['Cater_Name'],
; I$ `0 n! t5 i" J - "Book_author":response.save['Book_author'],
# \' g ^; L2 P+ b' _: N! J, S - "Book_Introduction":response.save['Book_Introduction'],! ~/ T* f1 V0 G3 T
- "Book_Synopsis":response.save['Book_Synopsis'],
' O: c6 U4 Q. v8 T* P/ i9 q - "Book_Palabras":response.save['Book_Palabras'],
& X3 L; h, ~& @- {9 p - "img":response.save['img'],, W2 p7 U) ?9 V8 a
- }
, j+ Z: }5 c. T2 q; _: N! x - for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():* A5 v. t" T3 @
- # for each in response.doc('.chapter-list a[href^="http"]').items(): ( ~9 `/ D# S0 [; s7 ]8 {
- self.crawl(each.attr.href, callback=self.detail_page,save=Datos)& K/ J) M! V( p8 k
- @config(priority=2)' d$ b% n# p4 C9 c! Z
- @catch_status_code_error
' ?' S- O" {7 `. c+ M5 ~/ s( i - def detail_page(self, response):
6 ]1 ^9 W7 p/ t, {# N: P7 w - NewRe1 = u'哈书'9 S1 \" M3 X, d6 D' c1 b
- NewRe2 = u'huhjsd.CC'
' }" G, e8 \* t" G- T, d - NewRe3 = r'^\\n\\n'1 P* D" x- t$ B3 y4 C
- NewRe5 = u'小说网'
1 y- B. n g1 p3 j1 Z - NewRe6 = u'fgdfgf'
, i( T9 C7 D: M; T - NewRe7 = u'fgfgf'
) b" j; }- O% `8 s3 A5 ~ - NewRe8 = u'ffhgf'
7 z: }* y! ]' v! n2 w - NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
1 p7 `( Y. B! l" g u - ReC1 = u'静思'4 _9 ^/ ~: \' {4 y( @
- ReC2 = u'aghgf.com'
- X6 v( V, B- W* L- ^, p& _ - ReC3 = u'aghgfh.com' |5 t, y/ n- i) ]! a/ r
- ReC4 = u''
/ ~1 @) ]1 u. X) G4 { - ReC5 = u'文学网'
4 w* I1 E' C! X6 f% Z8 m! M6 t - ReC6 = r'<BR>'
( E- N6 w8 d0 G1 Q! N: d, b - Bookname = response.doc('.readlocation a').eq(2).text() #小说名称5 ? F: M: x6 x: H$ h# T4 T
- print Bookname9 Y0 M- d t b; L+ c: s$ q0 B4 X' J8 f
- Cater_Name = response.save['Cater_Name'] # 小说分类
" \: u8 E" k, a& p( F$ p - Book_author = response.save['Book_author'] #小说作者# X' d* h2 n1 v
- Book_Introduction1 = response.save['Book_Introduction'] #小说简介# ?9 O; H& v4 ^ V0 r' y0 r: q
- Book_Synopsis = response.save['Book_Synopsis'] #最近更新; u% h0 T- H7 z- P- h- [1 r
- Book_Palabras = response.save['Book_Palabras'] #小说字数
5 T/ a# V8 N4 u& J6 ]: c8 g" H5 E - Bookurl = response.url #小说网址
% K/ e( l) f2 N1 i% j - Booktitle = response.doc('.article-title').text() #章节名称
. `+ [3 q# k( ` - BookID = response.doc('.readset-r span').text() #小说ID8 t/ U) ?0 v0 H! N
- BookConte1 = response.doc('.article-con').text() #小说章节内容
' X3 B$ |+ c: b - abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction'] #小说状态(连载还是完成)
, ?, f" Q5 K a0 h( _ - Book_Date = str(datetime.datetime.now()) # 采集时间
" Q( _/ C' y+ r0 Q+ [ - BookConte2 = BookConte1.replace(NewRe1 , ReC1)8 G2 P. N# t( t; j0 F2 U
- BookConte3 = BookConte2.replace(NewRe2 , ReC2)
) B% @5 r& x2 r- T; t9 I, x6 ^1 B - BookConte5 = BookConte3.replace(NewRe5 , ReC5)
% J3 i2 S) C: _* O# Q. { - BookConte6 = BookConte5.replace(NewRe6 , ReC2)
) Z+ p! y- a! J3 s - BookConte7 = BookConte6.replace(NewRe7 , ReC2)
5 P, w5 e1 E* N7 P7 m - BookConte8 = BookConte7.replace(NewRe3 , ReC6)
$ c. z: L/ k0 Y6 A4 S - BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)) _5 P+ R; O2 `4 o+ b
- BookConte = BookConte4.replace("\n\n","<br>")8 p/ X, H% N* j8 s V
- print BookConte9 ~- \0 y6 }- R3 a. z6 E
- Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)/ `+ @( z4 Y9 `$ u4 k
- Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
, N! g% _7 M* U$ c# k7 W - Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)% [; x+ t8 E1 o' n
- Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)' R p6 e( P$ A9 {. `$ b. i
- Titleid = response.url.split(BookID + "/")[-1].split("/")[0]
% K& |* j0 \5 Z2 m; N S6 j - Book_img = response.save['img'], #小说图片 l. ^6 c. R2 d: C7 i1 p) D1 M+ V
- ) w: j+ x2 d1 I) k- v1 N
- #insert into MySQL 小说入库& R6 y( F- ?2 P, l" G2 D
- self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布
/ I _2 l' o9 R. t1 T- `* C - self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布- m0 k2 k1 o7 x$ o
- #post提交发布; [2 @# [# R8 p7 L6 u5 f
- self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover) #这行可注译,火车头发布接口,不需要可取消) t- ~7 O4 J: d
- Datos = {7 c3 p" O, ~ O2 d
- "Cater_Name":response.save['Cater_Name'],
5 A2 H) |7 r! Q# e8 D - "Book_author":response.save['Book_author'],( E$ K0 _ x) o3 I6 n/ F; R7 E( [
- "Book_Introduction":response.save['Book_Introduction'],
0 s# U, o5 X, `4 ]( N" i; ^ - "Book_Synopsis":response.save['Book_Synopsis'],
; v D$ T2 ?. Y& A* E - "Book_Palabras":response.save['Book_Palabras'],; D5 s# z0 H$ ]
- "img":response.save['img'],0 a N- N1 m1 m1 q) O+ Z
- }
( ~! e2 [" ?0 E( l5 Q4 j! Y - for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
5 \( X* @/ `: ?0 J$ w) @- g - self.crawl(each.attr.href, callback=self.detail_page,save=Datos) ! U1 i1 W* a2 u8 M; i" P* ^
- return {$ w9 ?& o9 ]+ H% B8 A
- "Cater_Name":Cater_Name,' N, T# ]' A; B# O/ g8 v0 ~) l! x
- "Bookname":Bookname,
+ ^4 N! n5 O* Z+ _* t - "Book_author":Book_author,
# O; S. c: I2 i/ E. Q; l1 b4 P- D - "Book_Introduction":Book_Introduction,
, b' A1 D& J' [# v( {- u - "Book_Synopsis":Book_Synopsis,% F& f: @' Z$ W% n0 ~; E8 I, i
- "Book_Palabras":Book_Palabras,
( M( ]0 M7 l& R& P5 M# | - "Book_img":Book_img,
2 }* T' H1 N7 h% V* Z - "Bookurl": response.url,5 O3 F' n& x6 {* ]7 y8 L/ O* q
- "Booktitle": Booktitle,
1 p: N) d8 m# { - "BookID": BookID,
: `+ l F% W( C- `- b5 e - "BookConte": BookConte,) `1 u- v& r% Z/ ^/ {! ?1 u
- "Titleid": Titleid,
% K9 L' X s B - "abover":abover,& N& G [0 r: ]. B1 C6 F) ?
- # "Book_Date" = str(datetime.datetime.now()),& Y# W* V1 s% @" ]+ o. h) b
- }5 W& {& s0 ~, V
- def download(self, P_dir, imgDir, file_name, Book_img):; e' E" [5 F* _! Z- f
- if not os.path.exists(imgDir): ! n/ Y! U2 i1 G: Y1 ^( O% s
- os.makedirs(imgDir)
0 p. t" y; g% W - file = imgDir + "/" + file_name
( g4 v; h: d( k - # print file
3 w- {5 }7 Q' x - f = open(file, 'wb+')- ~( |" n- D1 r% P( u4 {3 a
- imag = requests.get(Book_img) $ a" `; J' |% @ `/ l; m
- f.write(imag.content)+ K" Z2 o% x; w& s* @
- f.close()% W1 _ b' y$ @! A/ t
- #保存图片前
" s! f+ `8 G' `0 h# p K+ M: X! ? - def save_imgs(self,response):9 }/ }5 E* E) \. _: X7 N k6 u
- content = response.content. B# x+ M+ T+ v% Z' J0 k
- file_name = response.save["file_name"]' ?7 G d: e, |
- imgDir = response.save["imgDir"]0 s- X3 s4 f7 @! p# f4 M. y
- file_path = imgDir + file_name
8 @% \% N6 t* l2 E a5 a - self.save_img(content,imgDir,file_path)
/ x3 T7 `, a) U7 V9 e - #保存图片5 p% U3 j. F' M4 r$ K) L
- def save_img(self,content,imgDir,path):
: ?( q* ~8 Q, r) Q/ F1 {2 Q$ h - if not os.path.exists(imgDir):
$ Z6 c; {' m% v& C - os.makedirs(imgDir)
X: d# u, s' Y% E2 A! u3 B - f = open(path,"wb" )
$ U3 E$ O* P7 K; Q( d0 q* r4 n2 ~ - f.write(content)+ L/ p' w' U4 i+ f8 n
- f.close()" o6 e7 E5 A) g h' A, ]# T
- #获取url后缀名
- N, `7 [! Q ]3 _ X4 N; k1 e' D, M& ` - def getExtension(self,url): ! C+ M& U5 a ~( Q
- extension = url.split(".")[-1]
8 \5 x' x2 o; L: Y# u; v N - return extension
4 l2 U- K. ]# l# E1 G, O+ f -
: E. o1 A5 Q) J9 o9 f: o - #获取图片名
" L6 |; d" R v- p0 |, e - def getname(self,url):
$ D! n5 _" d- [ - name=url.split("/")[-1].split(".")[0] D3 r6 I5 T3 O& h0 F/ N# L0 I
- return name
复制代码
! E7 B5 R7 @' g- T! N % `9 k7 T6 u ^& m% E9 z& m
|