Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
0 A6 A; x2 H3 ]- H3 P2 R1 t- #!/usr/bin/env python
! l# P4 q& f; l0 F' [ - # -*- encoding: utf-8 -*-0 H4 ^) Z+ \. m: W; {) W4 m/ j8 c) R% C
- # Created on 2019-05-05 21:43:11
' C( t& g1 w6 a9 J9 ^7 X - # Project: XiaoShuo, @: O/ |7 t( W0 R2 z
-
; L% R- M) q- Y! r- E s( O* g - from pyspider.libs.base_handler import *
# s+ K4 z0 i {' `! m8 s - import pymysql
) g% S: c3 |0 G3 | - import random8 B1 F/ H5 }5 o4 T) V# R7 P
- import datetime0 r4 e+ x7 A# P2 W3 m. ]* ]5 `- E. M
- import urllib2,HTMLParser,re
0 B# Y' \( O( ~% o% z# D% L' U - import os$ f5 r6 V* `' c& G* S5 J
- import sys
: z" C, X) F% U' G8 w/ h - import re
- _8 C; Z: ^9 M" q _+ ` - import codecs
2 m3 X4 G& W/ T8 H9 H$ y) _ - import requests
" Z8 V) b: ]) Y/ e) C+ I" G* e - import json% O5 u, q. o5 w
-
4 P8 w5 |. L6 n/ m - class Handler(BaseHandler):% l& t+ N; z4 O {5 k
- global Datos
) I) b2 t" e, R4 K# q - global P_dir
, ~7 `# J& \, P$ o7 ]2 q6 \ - P_dir = '/Tools/Debug/' #采集时候图片保持到本地的路径
: f: v: ?9 h' {3 B: b" Q! a1 b - global Datos5 g4 L! C0 |/ k+ u
- Datos = {}! z% ^; G/ U% f+ u8 _$ a% \$ o
- headers= {4 S/ Y8 `7 c, B; w" p
- 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
" o v8 f8 ?& q2 ~( z2 ` - 'Accept-Encoding':'gzip, deflate, sdch',6 p% `+ C# j" D; F+ ~4 z
- 'Accept-Language':'zh-CN,zh;q=0.8',
+ m9 R# U- @: L9 `/ j/ w2 T! J - 'Cache-Control':'max-age=0',
9 x I* j& H w& d - 'Connection':'keep-alive',
( P E3 b2 v$ A2 W( { - 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'& M: a' X% a: {1 V1 C
- }" g6 I) g8 D9 {
- crawl_config = {
+ I$ g3 ]. E7 P/ a" \1 E ~ - 'headers' : headers,
' e# E0 f# d5 i& ?9 A) r' B2 z - 'timeout' : 300
7 M: h' v( S- K- t+ u% l% ` - }, z( a. o. ] \2 L
- def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):) \8 L% e! |8 i
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")* t- j% c+ @2 D1 z2 ^' [" Q$ V
- try:+ e, R, N8 H. v8 x5 h# H
- cursor = db.cursor()
1 _- r" L5 E8 a- M3 F, R - #注意此处字符串的占位符要加双引号"%s"
5 j5 W& X% d& x) W. B - sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);" y8 z: R6 H L& f; ~
- # print(sql)( B6 a: W/ n- J3 d" |5 |* `( J
- cursor.execute(sql)
. I# G5 b" c( b/ R5 r -
: b1 ]4 @& n8 K: A - #qid = cursor.lastrowid+ K g% w, Y+ W3 w3 W
- #print(qid)0 ^( [; _3 z# Q( J
-
% k i; T. g/ S. f( j! L - db.commit()
$ o' X; V" Z- R5 p - except Exception as err:
1 `9 ?" I2 i0 y5 h# v2 O - print("Error %s for execute sql: %s" % (err, sql))9 U5 |( _6 g) l3 r! S
- db.rollback()* {3 E2 r t" |/ i1 O! E
- def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):' z$ Q" I6 J% |! u4 p4 Y
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"): F9 E1 w0 @0 v) N
- try:
, x3 `' o& }5 y# R - cursor = db.cursor()7 U6 n- V+ X7 _# ?
- #注意此处字符串的占位符要加双引号"%s"7 k2 B6 I' l& h, U, ?: `/ ^
- sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
5 ~0 ]: Q! i! L4 u0 v) M - # print(sql)+ }, T; p8 K, M% g% j% z
- cursor.execute(sql)
A6 ?9 o3 D, `6 \( C% Q, `( m - 8 z& P* N3 |* F' v
- #qid = cursor.lastrowid
* l' R- H- s3 w' i4 v8 k# f d1 P# v. E - #print(qid)
0 V$ [6 K" R( w; j/ F9 H - + U; J( ^2 b$ W% O6 j
- db.commit()
6 K9 p* a9 u1 r6 A* s9 B - except Exception as err:: X) `" m }' w, p; O4 v
- print("Error %s for execute sql: %s" % (err, sql)), {: @) r5 H- W: ]+ ]
- db.rollback()
1 }" {. B- Q7 K) O' B - def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):+ f# d( ^! p/ Q* q5 A
- db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
. r' _# p h2 k7 a7 Z - try:
8 {: Q+ E: v- L% R' {4 v5 O8 F - cursor = db.cursor()5 N1 h4 G* p, i+ D' _ U, B
- #注意此处字符串的占位符要加双引号"%s"
/ c" @7 Y+ b5 x - 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);
- m& n4 F) o. C6 [( g" Y- I - print(sql)$ n6 {1 K/ k( K! k: | ]
- cursor.execute(sql)
: s0 x o$ p$ ^+ U4 z- a - print(cursor.lastrowid)
9 A0 R8 ?4 |# m$ z. _; v - db.commit()% R$ P3 `; x: M' E6 P# o! U2 L, _
- except Exception as err:! e- [# e+ w P3 Z
- # except:9 |2 ~* q+ c/ G
- # print('Failed')! p4 z# K' ^+ x( n0 m0 {% Y
- print("Error %s for execute sql: %s" % (err, sql))6 w. H) u. _0 A
- db.rollback()0 v5 w; l& {% N) [* {0 [' _7 f2 n {
-
. ?, [ x3 U$ y) C( V* T3 ? - def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): / P* u' s& Z8 D
- reload(sys)
0 c$ c# d. o* C4 b - sys.setdefaultencoding("gbk")
# G8 s7 J2 z6 Y - locoy_url = 'http://www.******.net/locoy/?my=book' #697火车头发接口地址
/ ?# {& }' z) w |$ D& {/ I) F - locoy_data = {3 _! D+ s2 R3 T# {, k
- 'my_u':'用户名', #后台用户名 T! X0 w: b: e+ Y1 \$ [) `# k
- 'my_p':'密码', #后台密码
1 @( r% T+ m5 x4 l8 V8 r - 'subject_669977_net':Bookname.encode('gbk', 'ignore'),- [% C8 |& |# n+ C
- 'caid':Cater_Name.encode('gbk', 'ignore'),
& N; S2 ]0 v, y. `. ^9 G - 'title_669977_net':Booktitle.encode('gbk', 'ignore'),
" z4 U6 P+ f# R5 k2 y6 F5 y) l6 G - 'article':BookConte.encode('gbk', 'ignore'), |! L! o; F6 I
- 'author':Book_author.encode('gbk', 'ignore'),
' Q6 `- \& J7 |7 c. S; H" W - 'ready_1':Book_Palabras.encode('gbk', 'ignore'),
# b, Z0 u; |/ o7 `! R/ o! l - 'thumb':Book_img,
1 f$ u" N9 p9 r' J C6 D - 'content':Book_Introduction.encode('gbk', 'ignore'),
; n# u5 y0 q( U - 'abover':abover.encode('gbk', 'ignore')
8 U1 J9 c5 \' I& W7 J - }, x1 S1 I1 V& T# r% X2 t
- res = requests.post(locoy_url, data=locoy_data)- I' o6 E/ U' K- }& t# \% t
- print res.text
: o- Z" E/ b4 J: p - print res.content8 r* r+ B6 X; m0 Y, a T3 ^) I
- # print Dsd
1 t0 T+ \$ j* w" s0 v' z5 d - return res9 t" i1 x4 K/ d' V2 A+ E% g( [
- 0 M2 o$ @- q3 \$ h+ Y* y9 P
- def __init__(self):
. c r$ {: m- k1 I7 ? - self.base_url1 = 'https://www.****.cc/'+ L8 T/ i7 F; J. s# N
- self.base_url2 = '/'. n6 q! I1 {8 z" |5 s- D
- self.CaterId = []( e' u( q. H* U, H
- self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng'] q) h/ {$ _% s N
- self.page_num = 1& \. x" }# @( |
- self.total_num = 200
& b8 {% v6 m7 C4 D$ E3 y - - `) R8 S9 M+ I) U& Z: ?3 M3 G
- @every(minutes=8 * 60)
8 d# d% b0 U4 j2 V0 _ a l3 x - def on_start(self):
, N' m, @* a; K, O) S, S! H - global Cater_Name* Y) ~5 @1 ]7 R! Q6 \. F* _9 v
- Cater_Name = []3 {# m8 o' b! B
- while self.page_num <= self.total_num:
: \7 H% Z" d% f+ r5 P- { - for self.CaterId in self.CaterIds:7 n }! l. Z! h& v% [
- if self.CaterId == 'xuanhuan':/ Q1 \0 q* p+ ?- v; O( C( u8 _
- Cater_Name = '玄幻', X& r7 E) x, r" b/ d( J
- if self.CaterId == 'wuxia':/ b7 S% l! s, @
- Cater_Name = '武侠'
l; T3 g/ G- }2 _7 M l - if self.CaterId == 'lishi':8 h" a) L; Z! E7 v) E4 C
- Cater_Name = '历史' _; w2 N: {) F& B" A
- if self.CaterId == 'yanqing':
! {0 P* w s- c* A1 e/ \: P( a - Cater_Name = '都市'
9 v. b# w: K* \ - if self.CaterId == 'nvsheng':1 D" A# M) }1 X+ H& V
- Cater_Name = '都市' f' s4 w/ K! u, n3 O
- if self.CaterId == 'kehuan':
. O0 e* x0 O# \ - Cater_Name = '科幻' 5 J, M9 Q; l, C- `% R) Y8 U
- if self.CaterId == 'kongbu':
0 W1 j1 u) @6 N1 s, j' P2 a - Cater_Name = '游戏'
1 s5 v& J* E' ? t: b - print self.CaterId
& o1 {1 {; Y- j9 }$ {( V* T - url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"
2 d" s5 Q$ X# T: {# g y4 B - self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
: C H; E' L5 ^/ T - self.page_num += 1 - w* p2 C" b& L: r. ]# q
-
* `9 [- v# r6 C$ n( N) O6 m( ` - def list_Caterg(self, response):- z9 U3 i& E8 O$ G7 {6 s/ [
- Cater_Name = response.save" o5 i/ S' V" }* \
- for each in response.doc('.pic-list a[href^="http"]').items():
4 |/ d4 T. E+ M0 Q$ B+ L: q - self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
/ o" \' k8 e- J) k2 n - : @& I: U& g' x$ F) q1 R
- def list_Caterg_detail(self, response):
5 r* }: h/ H3 b/ p - Cater_Name = response.save7 o& L0 W3 C7 @$ T- }, y
- # print Cater_Name; Z1 e% U+ ?7 k. h, X% q% }0 E
- Bookname = response.doc('h1').text()) F* T, p2 ?- k- u' C! @
- print Bookname/ |8 x4 E7 F" @4 q+ P G7 U; B6 h
- Book_author = response.doc('.authorname > a').text()$ j4 [% e5 Q/ I6 x8 m
- # print Book_author
h- h* I' \& ?/ a - Book_Introduction = response.doc('.book-intro > div').text()7 s) p4 m8 N, ~! d D0 x5 ^
- # print Book_Introduction
- F9 P v& s) L! r0 x1 r$ e - Book_Synopsis = response.doc('b').eq(1).text()
% b: l a1 \9 Q- Q - # print Book_Synopsis
! h8 S! \6 E8 ~* H$ w$ s - Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
5 P% e6 m6 T2 u0 o' h - # print Book_Palabras& I) P$ ]; E) T$ z* N+ D) x$ U/ V$ n
- BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0] #小说ID$ a$ \, G0 n3 T. e1 l
- # print BookIDs: y* y' X0 }5 |6 }$ D; l9 _0 l
- Book_Dates = str(datetime.datetime.now())
0 X3 G4 Z" J- |( j; h2 B4 J2 p$ | - for imgs in response.doc('.bigpic > img[src^="http"]').items():2 D3 |0 F6 |6 _
- img = imgs.attr.src
0 u3 @! a1 _: V" g) N, `) } - print img
/ G- {$ \+ h8 e- U' h* D; T - #小说封面下载
: C8 O" \3 g1 l [ - extension = self.getExtension(img)
5 {8 r* E4 V1 @& r0 N6 d - name = self.getname(img)+ Q: N+ v2 g$ z @; @6 o
- file_name = name + "." + extension
" q. y2 v) h. o - imgDir = P_dir + name7 t2 B! B3 t6 H
- Locaimg = imgDir + "/" + file_name% i! J K [( q5 x
- print Locaimg( n0 }# t( r" q4 g1 S
- if(self.download(P_dir, imgDir, file_name, img)): #这2行可注译,图片下载到本地
% `0 `5 h6 ~3 c0 | - print('attachment url is ' + img) #8 U+ R4 s& d( t
- Datos = { L$ V6 s; I) f$ p! T
- "Cater_Name":Cater_Name,( v" I9 P5 B$ c* q o U* q
- "Book_author":Book_author,
9 s% x% z3 R, I! {/ N - "Book_Introduction":Book_Introduction,
# [+ D" L- ]0 E$ G8 t - "Book_Synopsis":Book_Synopsis,' B& j0 O8 e, S
- "Book_Palabras":Book_Palabras,
& R) f6 l( D; @; @# o - "img":img,. ]4 f( H" J& n0 k, Q' a+ V
- }
5 B! Z. {- Q. t" ~; ?0 W, W) q - self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates) #这行可注译,数据库发布接口,方便其他系统的发布
, p/ _# C, Y) K" T - for each in response.doc('div[class="bookbtn-txt"] a[class="catalogbtn"]').items():
* n# x' U5 E& ^, C k - self.crawl(each.attr.href, callback=self.index_page,save=Datos)
) f# F) h5 L- ?8 o$ x& D$ C -
2 h( R. y i+ a& T& w - @config(age=8 * 60 * 60)
0 W( T& K+ N1 g1 z: K* ? - def index_page(self, response): ; k) T8 n9 u p2 y
- Datos = {
, v* v | I' T( k$ N$ G ^! U- s) s - "Cater_Name":response.save['Cater_Name'],
9 \& v; f+ y0 U; ? @ - "Book_author":response.save['Book_author'],
+ B0 J: t s. u - "Book_Introduction":response.save['Book_Introduction'],9 M+ ^& X$ }& ?2 |( c" Q
- "Book_Synopsis":response.save['Book_Synopsis'],5 \" l$ g+ M4 b9 u% s
- "Book_Palabras":response.save['Book_Palabras'],
6 T3 J$ t% g3 n! Y5 S - "img":response.save['img'],0 J9 G q p, k8 b' A
- }
6 Y0 W( x; t5 u6 _ - for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
# Q* _; M# Z# F# {! c - # for each in response.doc('.chapter-list a[href^="http"]').items():
% i) Y. j& _ R7 r- n8 D - self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
, U, U& Z. _( G - @config(priority=2)
; _4 `1 I" O7 ]% N) e0 {* W% w6 ~" S - @catch_status_code_error; `* @' n$ r( z
- def detail_page(self, response):
, a( F( `. L1 {" [ - NewRe1 = u'哈书'2 v) Z. \6 O" {& F: _
- NewRe2 = u'huhjsd.CC'
' o& J- N6 ]2 z3 U - NewRe3 = r'^\\n\\n'. u* q" U, T' M7 T2 Y3 A) b
- NewRe5 = u'小说网'
* Q9 Q7 V2 @0 J$ `2 } - NewRe6 = u'fgdfgf'- f5 `; i" d8 w' W8 q; m# i
- NewRe7 = u'fgfgf'; I, Y: H7 B+ f+ R
- NewRe8 = u'ffhgf'
. ^7 D5 M ?& [: E: k6 [$ U - NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
# f" s& z- y/ R9 b* p& C* c0 d - ReC1 = u'静思'
2 P* I6 `1 H2 U; \ - ReC2 = u'aghgf.com', i) J5 `: B7 b" I% e" E
- ReC3 = u'aghgfh.com'* w) K% J0 n; [/ d e v
- ReC4 = u''" p, g7 s8 c m! M$ b2 V; \2 \
- ReC5 = u'文学网'# L0 c% W$ J$ ]& j$ T3 k
- ReC6 = r'<BR>') ~) f9 \; z( h4 s
- Bookname = response.doc('.readlocation a').eq(2).text() #小说名称
6 Y! T+ \% V% H( V% T6 X6 p8 V) d9 n - print Bookname, T8 `" }' L H! @! i0 U
- Cater_Name = response.save['Cater_Name'] # 小说分类
n6 I v }4 T* \0 e' k" C0 L - Book_author = response.save['Book_author'] #小说作者, o1 q& _# O3 l/ A" p
- Book_Introduction1 = response.save['Book_Introduction'] #小说简介7 l! ?* @; H& r% j2 _
- Book_Synopsis = response.save['Book_Synopsis'] #最近更新. _6 n8 T, g: d- |
- Book_Palabras = response.save['Book_Palabras'] #小说字数; X0 W& N2 _) ?- w/ b! e2 ?
- Bookurl = response.url #小说网址9 u) Z, A1 i# B t4 T
- Booktitle = response.doc('.article-title').text() #章节名称
0 J8 j8 D/ \$ s( _+ o- r - BookID = response.doc('.readset-r span').text() #小说ID
; r- K3 B( U# n A7 [7 s4 Z$ m - BookConte1 = response.doc('.article-con').text() #小说章节内容9 d% S3 |* B# S' l/ M
- abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction'] #小说状态(连载还是完成)$ V( T, z: \; B. P% T( i& ?6 u
- Book_Date = str(datetime.datetime.now()) # 采集时间5 v6 C$ e7 s; e8 {
- BookConte2 = BookConte1.replace(NewRe1 , ReC1)
' K) U2 h7 X2 G( j2 o: ] - BookConte3 = BookConte2.replace(NewRe2 , ReC2)% M5 E; j6 T5 h. s% K1 n0 O- [$ u
- BookConte5 = BookConte3.replace(NewRe5 , ReC5)5 s3 j- s: h% X) x6 d9 i
- BookConte6 = BookConte5.replace(NewRe6 , ReC2)9 N- ]0 i: c6 e7 R/ Z/ w. v" ]
- BookConte7 = BookConte6.replace(NewRe7 , ReC2)/ s, C( g4 A& p
- BookConte8 = BookConte7.replace(NewRe3 , ReC6)
! A/ ^6 p, K3 d; J" Z4 N; x! S - BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)% V! Z- T' K5 F% h9 c
- BookConte = BookConte4.replace("\n\n","<br>")6 R0 V7 Q) M: g3 d
- print BookConte
& a( N% ^: q a" E$ G7 x - Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1): X: c F/ M- U R
- Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)0 S q& L1 x! x
- Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
# _: L2 z) X* ?, m( r: `% _ - Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4); Y9 \7 N4 M% {% h; v$ u' U4 k3 \' U
- Titleid = response.url.split(BookID + "/")[-1].split("/")[0] 4 ~/ ?2 L* o4 U
- Book_img = response.save['img'], #小说图片: z4 k, p. s/ c
-
: A; k5 j8 |) x2 p( ?: }) {9 | - #insert into MySQL 小说入库$ Q5 y6 C8 C+ ]) M0 Z
- self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布# _2 B V6 j0 V/ B8 G. y( z( b
- self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date) #这行可注译,数据库发布接口,方便其他系统的发布- b0 z- h# W( i$ m3 h7 |
- #post提交发布& d% o% P% G6 C% s1 y
- self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover) #这行可注译,火车头发布接口,不需要可取消
" p- [- S, ?5 c! _+ {( j - Datos = {
% M$ N9 c0 C. D g - "Cater_Name":response.save['Cater_Name'],+ F7 R* m2 m9 G
- "Book_author":response.save['Book_author'],# F' a) O7 |9 N+ F
- "Book_Introduction":response.save['Book_Introduction'],
, r' G/ U# j( v/ K7 v - "Book_Synopsis":response.save['Book_Synopsis'],) n6 [% h: x7 q: c' h2 K9 x
- "Book_Palabras":response.save['Book_Palabras'],- ?) N' N3 _3 s1 q4 F0 x
- "img":response.save['img'],
8 T) z( Z* H9 Z! h1 o, t* P- U - }3 b3 L( w2 O# Z1 \" H1 P
- for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():% c3 }- m6 D7 p" `# {0 w3 Y# h
- self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
* P# M0 t" ^0 ^: i* B3 e - return {
" T$ C& v. }: a' s( v2 R( |- q - "Cater_Name":Cater_Name,1 ]; X2 G% J9 \- f1 c5 ]
- "Bookname":Bookname,4 O; |/ W$ x3 y: x- W8 B# _
- "Book_author":Book_author,9 J; q5 Y7 r L" q( {: l1 Y+ d
- "Book_Introduction":Book_Introduction,9 s8 `) M( V/ q
- "Book_Synopsis":Book_Synopsis,
* e: {4 L1 ]. C3 t - "Book_Palabras":Book_Palabras," e5 [5 W7 e* s* s1 S
- "Book_img":Book_img,
4 j" x4 N. ?' b* c$ M) J, Q - "Bookurl": response.url,2 I! e0 V5 D2 P) h6 y
- "Booktitle": Booktitle,
- C9 F, Q# h4 A" q! x - "BookID": BookID,
2 Z' i' R6 r" @/ t* M: v. U9 [ - "BookConte": BookConte,- B% E* k9 q& I% R- p
- "Titleid": Titleid,, I" q0 R. u# j! l
- "abover":abover,# l- F' I* {9 g% n4 l
- # "Book_Date" = str(datetime.datetime.now()),( }" r& ~ R' H2 j2 z
- }
: q H$ Y5 ]; O6 K) X - def download(self, P_dir, imgDir, file_name, Book_img):# o k- F' r, C H) H
- if not os.path.exists(imgDir): * p1 c" c- C& |. s7 D
- os.makedirs(imgDir)# [# N* L) ? _" G7 g; y; S H! f& T
- file = imgDir + "/" + file_name
. W# r5 h7 p5 E. S# } - # print file6 m& S4 G8 z# G0 x
- f = open(file, 'wb+')
1 Q) C$ m, I- j3 m3 W* y O - imag = requests.get(Book_img)
9 ^# {" T% |: Z# e - f.write(imag.content)% K6 {: x" `: o7 T- h/ T. ^
- f.close()
9 Y- U5 e& @, ~9 O S9 G - #保存图片前
: b5 U. k& i/ a) }0 w2 X9 e( ~ - def save_imgs(self,response):4 i. Y# l- j; _9 \
- content = response.content
6 g0 {5 Z6 N! R+ P: x& T- ^ - file_name = response.save["file_name"]1 P. Q, r: E7 t& U
- imgDir = response.save["imgDir"]) G, p8 T& g" y. P
- file_path = imgDir + file_name
4 F3 C4 v- o# ^0 e, a$ L - self.save_img(content,imgDir,file_path): p9 F: g2 F. f4 b1 W/ r
- #保存图片/ A# b1 V' f7 T& L& l
- def save_img(self,content,imgDir,path):
4 V$ D" x" P- v - if not os.path.exists(imgDir):
; x* x; ]! y' j9 y- \! H - os.makedirs(imgDir)
0 J; A* t2 k Z" A$ |0 { - f = open(path,"wb" )
/ S# ^2 C" e1 r4 q1 N( J - f.write(content)) k) A9 z2 @7 I; v
- f.close()
9 T2 d ~+ z, S: ~" H0 v1 ~0 w - #获取url后缀名% ?1 h3 x7 f/ Y# K0 B
- def getExtension(self,url): + O/ z ~3 C* w0 V# N
- extension = url.split(".")[-1] ]% P: j& U3 k& h, N/ ^
- return extension 4 z$ E R7 ^0 r9 R* Z9 U" d
-
" {. F7 t: ]$ ^$ G - #获取图片名
# M8 e$ e+ g- i7 [' Y' _: w) H1 v - def getname(self,url):4 H8 Q) M% |8 l# i9 o' \; B
- name=url.split("/")[-1].split(".")[0]
7 C0 h+ q& t, N$ [) n2 O( u - return name
复制代码
% q5 s X/ {1 z$ H/ F( @
# g0 f* R% N& ~/ q4 o+ i }2 o; |* Y |