找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1591|回复: 0

Python + pyspider某小说站的爬虫,入数据库,火车头发布,资...

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!6 Y( m0 t- K6 o* d5 G% _; w4 l# B
  1. #!/usr/bin/env python
    6 X  \/ K- m' F, l  a
  2. # -*- encoding: utf-8 -*-" ^1 W3 t' F1 [
  3. # Created on 2019-05-05 21:43:11' t4 L6 r! @8 f' c
  4. # Project: XiaoShuo2 r+ C' k- c( C6 @8 `1 `* v
  5. 3 V& @7 ~2 e: M* d, Q+ K
  6. from pyspider.libs.base_handler import *! t$ j' x4 _( |- E
  7. import pymysql
    5 s; X/ }2 [) g  u5 j
  8. import random7 m! ]8 A6 Q) Q2 x; U! d' ?3 Q- x6 z
  9. import datetime! H, L* e1 H, Z. J1 Z( ?2 W
  10. import urllib2,HTMLParser,re
    ' j4 |" N* s3 G# A
  11. import os
    8 R. d! A  c. _( B' z6 I
  12. import sys" P& c# a) g1 Q, ^* r$ M
  13. import re$ B0 a: U7 t9 M: _6 l$ T3 Q
  14. import codecs- n" u. j% W2 Z: n  P
  15. import requests* S- u) H4 o% I+ `5 K
  16. import json
    ; ]8 J$ F8 ?) l; D1 ^
  17. 4 q7 D9 D: t/ l' ]7 R
  18. class Handler(BaseHandler):
    . `1 Q8 }5 \6 K$ T
  19.     global Datos5 _" b# U% w+ h6 [
  20.     global P_dir   
    ( U2 N+ T" z: [( n8 \: @' T9 ~2 d
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    # m) W  H% ^8 }6 R. y) H9 `
  22.     global Datos
    6 r. Y) {: o. ?  j
  23.     Datos = {}
    9 r8 t* m9 I, |6 k' u" y) v
  24.     headers= {
    ( m% z- c# H: x$ ^2 Z7 y9 e0 l0 q+ G
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',! v) Q/ G' k/ K, l; E
  26.     'Accept-Encoding':'gzip, deflate, sdch',( w9 J# [; G. _: p
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    2 z9 l! s1 C: r3 a6 L5 D* i
  28.     'Cache-Control':'max-age=0',& \. l- W3 P: ]7 y: t) p
  29.     'Connection':'keep-alive',- X! x: V2 C- \2 k/ U
  30.     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'4 |+ \) D0 }$ c4 v  M
  31.     }
    , U! F/ e- l& K0 C- u
  32.     crawl_config = {
    ( ?' G3 ?. X7 U1 s1 U# T
  33.         'headers' : headers,
    - K0 `; a" z# ]0 T0 L9 @1 g
  34.         'timeout' : 300! f' n9 K& W' l$ ~& D8 G
  35.     }& r4 k& |% ^. B
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    : _' r6 I* ]0 F8 r8 f2 y! A
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    " j0 G. t  p) i) G' ^4 }
  38.         try:3 h1 V& c  t  P, \+ p- a
  39.             cursor = db.cursor()
    0 M1 W) n! g, X/ P& h4 R+ ]
  40.             #注意此处字符串的占位符要加双引号"%s"
    $ @+ _0 w* L# {7 f5 T# @# y
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    # o7 X# Q& O6 Y2 e9 c
  42. #            print(sql)6 n' m6 D4 i# B; v
  43.             cursor.execute(sql)% ?( T1 x0 V* z+ _( e* t0 T
  44.             # `& \9 B: P: P$ A# e  e
  45.             #qid = cursor.lastrowid/ {3 d) o# g" Q; b% j: \0 ^8 M! {  o
  46.             #print(qid)
    6 F2 B5 p! u1 y1 G, q* b5 K
  47.             2 U7 y, [5 Y1 b+ O: g/ N$ ~
  48.             db.commit(). Q3 {) Z. h- F2 s/ B. \9 ^/ s3 ~
  49.         except Exception as err:
    5 v  ?. b& m, h  g4 c$ Z( A4 i9 g
  50.             print("Error %s for execute sql: %s" % (err, sql))6 m" \, d9 p, |" T; S
  51.             db.rollback()  w0 E3 c0 o: r, u  p$ {" S* i. m* q
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):4 e4 h2 d* m, L
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")  k9 v8 t; D  t2 g/ L" U
  54.         try:. J' {1 D0 o* p' u
  55.             cursor = db.cursor()
    + l# @3 j3 r* `( _
  56.             #注意此处字符串的占位符要加双引号"%s"9 b( T) b; Q2 K" P" l1 m
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    7 i5 G2 K2 l3 T) k  R
  58. #            print(sql)
    ' f) H" C9 m4 N
  59.             cursor.execute(sql)
    . i" d5 ~$ U& A( U1 K
  60.             
    1 H1 G+ {! P9 T" j! `1 ?. j
  61.             #qid = cursor.lastrowid1 L# ^% ?$ ?! ^4 {, N$ R- A' `7 w
  62.             #print(qid)$ T  n; J3 H. t2 Z
  63.             
    5 ?; ]1 y8 f: B* r
  64.             db.commit()
    7 D( H/ E+ D- W# V5 Q
  65.         except Exception as err:
    # F- h; `  _6 y$ c" N9 J
  66.             print("Error %s for execute sql: %s" % (err, sql))# g0 U8 ^2 a( ]/ }
  67.             db.rollback()
    : S( J% {" o' I3 X+ t: k6 q
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
    4 z+ N* l; ?9 L6 C' E. B; ]" |7 h
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    + Q8 N- b+ V% S' t% y# ~: b( e
  70.         try:" H* J" V  c' F
  71.             cursor = db.cursor()" K$ b# D0 j! B4 C- w+ W
  72.             #注意此处字符串的占位符要加双引号"%s"
    0 _' U8 Y) N# x" t. ^
  73.             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);6 Z4 w2 Z4 P2 E
  74.             print(sql)
    $ Z  Y6 V5 {, G; A9 p4 V9 l" l2 A
  75.             cursor.execute(sql)
    / l$ c( X7 g. P+ S* q
  76.             print(cursor.lastrowid)
    % w+ f! ]2 v' e  h3 f
  77.             db.commit()
    2 X. |9 l- a, Z! `! x  N; i# @
  78.         except Exception as err:
    ; n- Z% ~3 S, h
  79. #        except:9 @$ L  _. A- V3 E  ]2 O% g0 y
  80. #            print('Failed')
    ( Y, x1 _9 }/ U# ~6 N
  81.             print("Error %s for execute sql: %s" % (err, sql))
    5 T6 p0 f3 T2 L/ c
  82.             db.rollback()5 V2 z7 ^) Y. a
  83.         ' s% _2 ]; o& }3 }% d; [5 s' W
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): # [- b* r0 X) t! |- @  }
  85.             reload(sys)9 U, N& G( r- z* ^' h' e
  86.             sys.setdefaultencoding("gbk")& r8 ], v  y( A  y2 \4 Z- f( |
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    & I7 o) C8 w2 M% w! B
  88.             locoy_data = {- t9 d5 A" A# m1 t
  89.             'my_u':'用户名',   #后台用户名) ^% N" Z) |2 Y' O+ O# J+ b
  90.             'my_p':'密码',   #后台密码1 P  b: Q9 n' L% Z$ Q/ q
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    2 e* I" X4 F' \+ e' [/ R0 Q3 v* ]
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    ( n6 z- P, W: j# T6 Z
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    ' u+ Z3 |' w0 E4 M/ W2 S" A: e
  94.             'article':BookConte.encode('gbk', 'ignore'),
    - r& J3 d% s. f5 ?; \3 m+ @; j
  95.             'author':Book_author.encode('gbk', 'ignore'),( M! Q6 T2 |( {
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),; g- P$ j+ J8 k1 G; h
  97.             'thumb':Book_img,  v1 D7 r2 x* h8 t" @1 N
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),  u; `/ C$ D) C  V
  99.             'abover':abover.encode('gbk', 'ignore')           ( R8 B4 t7 b5 @& k$ v# ]
  100.                 }
    / R( }& ?* k& F4 m' w
  101.             res = requests.post(locoy_url, data=locoy_data)
    6 ]8 @, x% X/ U( T: \7 m
  102.             print res.text
    5 r3 b# W+ ]0 M8 K0 t: [
  103.             print res.content
    3 A/ g* i# h; B2 Y% o
  104. #            print Dsd
    ! j$ q: r# ~  `9 d
  105.             return res
    - x- d6 [: n; L5 s: [
  106.     ; D: n$ d8 r4 I4 e/ ^% Y9 _
  107.     def __init__(self):7 t$ L8 ~1 Z: }
  108.         self.base_url1 = 'https://www.****.cc/'# Z( f3 m5 D( k  X+ D! G, e
  109.         self.base_url2 = '/'3 I: y% I8 q& ^
  110.         self.CaterId = []
    / c0 R8 n- s- n& m$ m
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    6 s5 }0 |$ ^2 h0 s- g5 F$ w
  112.         self.page_num = 1
    1 Y, h7 ]* I4 z0 ~& g* c
  113.         self.total_num = 200   ) o; `( N& a  t6 S$ u' u

  114. ) r6 f( V$ ]: w8 k+ @
  115.     @every(minutes=8 * 60)2 |. L: D: ^+ |
  116.     def on_start(self):
    : q6 M1 j- |2 |2 a# q& e& m" G
  117.         global Cater_Name0 Y) G; Z. {/ r; y- s# l, y
  118.         Cater_Name = []; N* N' H; N* J5 h6 U. w5 o
  119.         while self.page_num <= self.total_num:   o, o3 c2 H/ d
  120.             for self.CaterId in self.CaterIds:( E& W, t# O7 S2 u, k4 A
  121.                 if self.CaterId  == 'xuanhuan':5 C8 q5 E6 l* v# r, K; i/ Y7 n! h
  122.                      Cater_Name = '玄幻'* ]' ?6 U1 o, N; k! {, B
  123.                 if self.CaterId  == 'wuxia':9 W" e( ^; q5 e# h- L, P5 Y8 X8 u
  124.                     Cater_Name = '武侠'
    2 U* ~# Q& ?# U; K7 y( W+ S
  125.                 if self.CaterId  == 'lishi':
    ! S/ R( M* M+ E2 f8 y7 o
  126.                     Cater_Name = '历史'            
      A: V8 Y! P) S) Q1 f5 u6 {+ R
  127.                 if self.CaterId  == 'yanqing':2 F' K* i# M% j% a9 m! T$ a& Y
  128.                     Cater_Name = '都市'
    ; g  A% w" |7 g: D3 u% J
  129.                 if self.CaterId  == 'nvsheng':" f7 w* G0 L+ P9 l0 u6 M
  130.                     Cater_Name = '都市' ; b7 y$ y" R2 V" X
  131.                 if self.CaterId  == 'kehuan':$ I) m0 e7 V5 Y& R
  132.                     Cater_Name = '科幻' ; p( Z; P, ^4 c6 p* H7 X* Z0 Y
  133.                 if self.CaterId  == 'kongbu':$ N7 O0 |; T* a7 L3 K
  134.                     Cater_Name = '游戏'
    6 a1 g) L& U! w, n7 _
  135.                 print self.CaterId1 O6 x$ Z: S) I' s4 z& |
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    $ @' O. [% @; X/ L
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    ( e& X* s6 u4 h, g
  138.             self.page_num += 1 * Q6 g/ L4 z" q3 {, w- |% Y; [
  139.             
    / P/ m  g; U+ k+ N
  140.     def list_Caterg(self, response):
    : [; i. C5 M, D# z
  141.         Cater_Name = response.save2 Q4 `+ x) K8 O
  142.         for each in response.doc('.pic-list a[href^="http"]').items():7 s- O2 ~$ \: y- }
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)* v8 Y. y' t9 P/ D
  144.             , L4 t6 Y. u$ H- h
  145.     def list_Caterg_detail(self, response):
    ( s) D+ _. B$ I" v( j7 n; s
  146.         Cater_Name = response.save
    ! n0 v; h& \# K" x" t/ O  R
  147. #        print Cater_Name- E6 S  \8 u* I5 A7 V& z! a  A  Y
  148.         Bookname = response.doc('h1').text()1 U8 |4 n4 O, W, U% K
  149.         print Bookname% j7 P# A3 y: F
  150.         Book_author = response.doc('.authorname > a').text()
    1 z2 @# n  M2 w3 u
  151. #        print Book_author7 p, n  D, X$ M7 q1 v& R- a8 {# N8 M
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    ! m# {" X4 o- }, W& J- f
  153. #        print Book_Introduction( ?6 k+ G2 t1 N' s4 h
  154.         Book_Synopsis = response.doc('b').eq(1).text()  ]" k8 G# M1 K( l0 a7 f: |
  155. #        print Book_Synopsis
    + A3 ]' _/ q' B) G: V
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    ) q9 Q2 g. F; n, Z* [4 |
  157. #        print Book_Palabras
    - i) ]" K* _" a! z& g* _( _  _
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    ( u' T7 R$ d/ x  E. i# ~& V
  159. #        print BookIDs
    3 ~0 _  z$ J% J. X& t8 D* Z; K4 F
  160.         Book_Dates = str(datetime.datetime.now())         9 A# T# U. t2 W
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    . o4 L+ ^6 |3 z7 o7 t
  162.             img = imgs.attr.src' M) \. E) V& ]/ W' P7 I
  163.             print img0 I4 o3 G2 C2 k4 y2 A
  164.                 #小说封面下载+ K: W) F9 p$ h
  165.             extension = self.getExtension(img)
    : L9 D; V% l" J9 r
  166.             name = self.getname(img)  J7 T7 k; ~& b* E# ]
  167.             file_name = name + "." + extension. Z# c- e  v5 h
  168.             imgDir = P_dir + name$ v  d5 P8 e/ T2 i$ r' g/ d$ b
  169.             Locaimg = imgDir + "/" + file_name& s) C5 _# u8 ?3 H# b) m3 ~
  170.             print Locaimg
    # C, l2 s5 t& z9 S; n5 q+ j1 v
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地2 ?4 V6 x7 C% r
  172.                 print('attachment url is ' + img)               #  D2 i1 E  F, \. a  _) }! P
  173.             Datos = {4 H; D- y, Y( B
  174.                     "Cater_Name":Cater_Name,
    - o+ \- m8 T: N; D) u3 H
  175.                     "Book_author":Book_author," E( M/ P$ i- r+ M; h: i
  176.                     "Book_Introduction":Book_Introduction,+ @. h3 }5 R7 R2 K! t7 i3 `
  177.                     "Book_Synopsis":Book_Synopsis,
    5 D8 ^: {/ m* W5 ^6 m
  178.                     "Book_Palabras":Book_Palabras,/ I0 @; l+ Z) H8 ~: ^" n" u
  179.                     "img":img,
    ' g4 Y8 D" N. R2 O0 l
  180.                 }
    ' a7 N/ s2 R. E; U8 Z( g
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    / }1 _4 x) I+ f% ~1 d
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    9 B& b. B( W( g
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)3 j1 N- b; R/ _
  184.             . D! L+ R1 Q8 Z9 A
  185.     @config(age=8 * 60 * 60)    7 |6 w) n' Y- N! J' z* h  m
  186.     def index_page(self, response):
    7 O- V0 r9 M, e: v
  187.         Datos = {  _) Q% V* u+ X: c" x# F. G; ?
  188.                   "Cater_Name":response.save['Cater_Name'],4 b3 `% i8 Q2 L6 }: A2 O$ r
  189.                    "Book_author":response.save['Book_author'],
    $ o$ ?+ U1 J' I
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    ) e# A3 ?+ j7 o! E5 b
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],: w! \4 U5 B8 Y
  192.                    "Book_Palabras":response.save['Book_Palabras'],
      i+ ^) `  M- b9 O) M* ~! ^
  193.                    "img":response.save['img'],
    ' I, F# [7 l  c0 D" u
  194.                      }
    , ]. G0 V! r" L. Q5 O% Q( Z
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():/ [" P4 p0 n* l. n7 X
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    5 Z2 d, s& }2 O/ F7 o# M' C
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    * p& C* [9 D% k  G' e/ L2 L
  198.     @config(priority=2)1 m0 ?% B/ U, P7 n1 x3 W# v  h9 A
  199.     @catch_status_code_error
    4 i  ~: Q) o" V
  200.     def detail_page(self, response):        # D4 V# \; m8 c2 c0 }6 j# ]
  201.         NewRe1 = u'哈书'
    & c/ {, X) J- v% E4 U
  202.         NewRe2 = u'huhjsd.CC'  i2 S+ y3 h9 \. v* S1 x
  203.         NewRe3 = r'^\\n\\n'5 W4 s7 a0 b3 I9 n5 d/ E1 r$ U$ F$ f
  204.         NewRe5 = u'小说网'
    . `7 ?, E6 v0 n% E8 \4 U( y
  205.         NewRe6 = u'fgdfgf'6 d7 v8 {; C; `$ D: _
  206.         NewRe7 = u'fgfgf'
    1 M5 v1 p; h: R. S
  207.         NewRe8 = u'ffhgf'0 h# ^. E" x& R/ z
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+', t  _- w  K. d
  209.         ReC1 = u'静思'# S  F- Z$ `$ g2 U7 U& ]; N: O
  210.         ReC2 = u'aghgf.com'
    , N6 f' ^" r% q, `6 q2 B
  211.         ReC3 = u'aghgfh.com'+ f( t7 ~' O  k# }6 M/ @$ |
  212.         ReC4 = u''" _( j' G+ f8 K5 J) K+ _+ f
  213.         ReC5 = u'文学网'
    2 H& z4 t% ?: |" [. I: x
  214.         ReC6 = r'<BR>'
    + ]( u6 f# N6 Z0 ?; @5 [
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称( B5 `; r& J/ s; O
  216.         print Bookname0 {  c9 f/ q/ A- `. t( p
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    ! l9 ^9 S7 X& H
  218.         Book_author = response.save['Book_author']   #小说作者
    # T9 d/ `+ ]3 h# P
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介# e7 P$ E3 o. j, D- C- \
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新& Z: b5 f" x# b- W9 b" F
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数& t$ Q1 Z4 c0 @* x) O; v3 p
  222.         Bookurl = response.url   #小说网址# k/ L6 K, ^- d  h
  223.         Booktitle = response.doc('.article-title').text()   #章节名称! d4 b( x/ {, \9 Y& r$ G: d  b* v
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    $ P: N- O! J. }5 P1 S
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    . O$ |! E/ [  W7 p
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)' S2 Q, i2 h6 E* o( Y
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    , ^* B. X' [; w8 _1 W! i
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)2 }+ s; t  O: h
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    ! h8 w- N  O/ x7 Q( C! `
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)' {( ^$ Y, E4 _4 H, r
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    8 b! h" T& A' v& Y& X
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)# N" t. L/ |+ h+ k' Z6 k  `
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)2 n# K6 ]* w8 M0 C
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    , {0 v5 S, p# c# \$ L& X
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    % K! _: G( u" I; I0 v6 [- ^  d
  236.         print BookConte
    % D! ^: f/ f0 C- Z' G
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)2 k- R6 Q& V. }' k0 X6 p5 M) z
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    7 \) c4 C4 W' T6 y' B7 H3 a
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)1 d6 j: O# X% w# C/ @' |- K9 q
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    : X, E3 l. U) I( B0 [: z# m; \5 M" W& T
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    * s3 p0 P* D- K
  242.         Book_img = response.save['img'],  #小说图片6 l+ t; m+ `1 [. K* j. t/ V8 c
  243.                X+ C3 [3 _' T
  244.         #insert into MySQL 小说入库+ f3 K3 E5 z7 D
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    - S0 t3 k/ ]0 Y% m( ^2 y
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    1 e7 J% `/ b, v7 W( l
  247.         #post提交发布( v0 |  D  [3 ^% O
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消9 [: C! W- m' @8 P( u' S
  249.         Datos = {
      {' N" q; |: g9 h
  250.                   "Cater_Name":response.save['Cater_Name'],+ n- z) z. N2 E( f
  251.                    "Book_author":response.save['Book_author'],
    ( ?4 ^% j; N1 d4 B' M, a$ H
  252.                    "Book_Introduction":response.save['Book_Introduction'],# J% U# s9 e; |# ?2 a! `7 z
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ! d# c. z( t+ D3 k0 L3 w
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    ; \- U4 X, k+ _0 C5 u% Z9 r
  255.                    "img":response.save['img'],  g) }# |% \5 H- B  j
  256.                      }
    2 @: |( s; d* d* Q; a+ i$ N
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    - I7 }- ?3 l  |& N' _
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) 1 t  [" E+ y/ o
  259.         return {
    7 U8 m! d$ E. w$ r4 D4 L
  260.             "Cater_Name":Cater_Name,) k9 s; U* u; |# \  a3 s! r, w% B
  261.             "Bookname":Bookname,
    # q# F/ p: Z, i/ Z) o( q% s' e
  262.             "Book_author":Book_author,/ H3 ]  b- p, T5 Z! `) g
  263.             "Book_Introduction":Book_Introduction,1 _6 s( H4 w$ g8 I
  264.             "Book_Synopsis":Book_Synopsis,
    0 R) P9 g' N+ B% J* c
  265.             "Book_Palabras":Book_Palabras,8 m- f5 l' x8 W7 |
  266.             "Book_img":Book_img,) U& _1 I& @' H
  267.             "Bookurl": response.url,; r4 X8 A) g1 @% i
  268.             "Booktitle": Booktitle,
    9 K& L6 M$ j2 t+ v; |0 W
  269.             "BookID": BookID,# C% L* S* O1 X" f4 X
  270.             "BookConte": BookConte,( }; x& A7 z& O: w; x
  271.             "Titleid": Titleid,
    & a  k7 E! B" P& `
  272.             "abover":abover,* S- K5 |2 C: N( x- Y& n
  273. #            "Book_Date" = str(datetime.datetime.now()),* o$ j8 u/ a2 C5 X1 G' [8 j6 n
  274.         }
    % Q5 {5 p# Q# V& S8 A1 L
  275.     def download(self, P_dir, imgDir, file_name, Book_img):# @3 e' E+ ?8 K
  276.         if not os.path.exists(imgDir): 4 x  W( l3 U$ O% Q) E0 C
  277.             os.makedirs(imgDir)* ?3 n- M- d" D2 r$ k6 z1 T# ]+ [
  278.         file = imgDir + "/" + file_name$ \- |9 |5 W' }6 P' s6 z
  279. #        print file
    : `" v. j5 |; J9 `% U
  280.         f = open(file, 'wb+')
    , C# g. `% b. m4 O
  281.         imag = requests.get(Book_img) 5 \$ k" t# i( E3 S
  282.         f.write(imag.content)
    " ?7 o# Z0 b% ?& M
  283.         f.close()
    3 N9 e4 B8 Z8 m' C* F2 W
  284.         #保存图片前7 ?3 v% F9 A  a/ ]) @9 C
  285.     def save_imgs(self,response):
    & C# i  g) i! z
  286.         content = response.content
    ; N5 Q$ C- Z1 ]' k* u( [6 t
  287.         file_name = response.save["file_name"]+ `. ^4 ]8 J+ z% `) s* z
  288.         imgDir = response.save["imgDir"]7 v# h8 ~( J/ E5 S3 w/ ?
  289.         file_path = imgDir + file_name0 q, P, \, I2 e$ r
  290.         self.save_img(content,imgDir,file_path)
    8 \$ L2 S/ c7 M* G
  291.     #保存图片' a7 g* c! B4 G9 B- u- y
  292.     def save_img(self,content,imgDir,path):
    & h2 J$ G$ J% m) O
  293.         if not os.path.exists(imgDir):                        
    . s. D( e! C! s! ^+ x3 C
  294.             os.makedirs(imgDir)- ]8 p) ]. J' ~
  295.         f = open(path,"wb" )! N0 ]' \7 v) f4 R7 N
  296.         f.write(content)
    . D) [% E% Z0 Z6 L
  297.         f.close()
    / Q. d" n3 u- l+ ~5 q9 u' K% u5 L- O7 S$ J
  298.     #获取url后缀名
    $ c; H2 P* p% P; M
  299.     def getExtension(self,url):                            $ W9 T( L+ |! t% w; \9 U  O$ e7 X" Y
  300.         extension = url.split(".")[-1]
      z, r0 U5 J  M' l
  301.         return extension 1 Q" [8 N: q+ X2 h! J# Z$ q
  302.     , H* B( I- k2 \6 }: v2 e
  303.     #获取图片名# W( W4 U4 }) z! c( U+ m6 Z
  304.     def getname(self,url):
    6 z; {; T: B$ C* }; f, I
  305.         name=url.split("/")[-1].split(".")[0]
    " d$ W  E5 |4 B6 t! A
  306.         return name
复制代码

5 h1 J. b6 }1 K

& t. a8 M2 c' x1 T  O$ W, U6 c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|中国飞逸网

GMT+8, 2026-1-9 14:39

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表