找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!' e/ R* l. H5 m
  1. #!/usr/bin/env python
    7 q. s9 E8 ~1 ~0 M  e  o3 }( _
  2. # -*- encoding: utf-8 -*-9 c2 Z. U: Q- c  @6 n% b/ b: N5 w
  3. # Created on 2019-05-05 21:43:113 s7 @& ~3 a, }8 o! A
  4. # Project: XiaoShuo0 y9 Z. P2 z+ ]7 X7 Y" V+ q# l

  5. 2 U. w( e. Q" |# h1 C) R
  6. from pyspider.libs.base_handler import *
    . M' d9 B- v5 ^! N0 R( M5 @
  7. import pymysql
    / M' w! ~. S2 z+ B( V  ]
  8. import random
    $ h0 l& t4 f: b( Y3 s  B6 g4 A- {
  9. import datetime
    ( y  ^. C- P- J6 k- `9 j9 E
  10. import urllib2,HTMLParser,re
    7 {! P% M, k" s3 k1 o! n
  11. import os, R/ v6 t7 M0 R$ {6 H, t
  12. import sys" i, K, G: z6 s, g' W" Z
  13. import re. L5 K& d- Q# s/ f4 }6 T( Q0 A
  14. import codecs
    & z8 C# Y) ~: a. T
  15. import requests+ c1 k. |! }6 l% q
  16. import json
    % e' g& R. u) a' v1 Y8 c

  17. 0 h9 }' i. I8 j2 B" c
  18. class Handler(BaseHandler):: g; q3 L& Z% i3 C9 D- h. Y5 ~
  19.     global Datos
    ; U1 ~: Z1 W, Z' ~4 w& ^4 y- e% d0 C
  20.     global P_dir   
    6 }7 \2 m% p& z8 j0 g* N% C7 ]2 a
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    - N# x) y( C! A. X) g( d% }! ?9 d
  22.     global Datos
    , i8 j* q3 g. J1 T
  23.     Datos = {}8 \3 u! {+ J7 P
  24.     headers= {
    4 w, ?& H* L3 h7 S; }5 l" p
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',' b: Y" ]+ \: Z' Y  S) s
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    0 G+ c8 J& H5 }# @
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    + V: A1 F) M  m( j6 `! C
  28.     'Cache-Control':'max-age=0',
    6 }1 t% f0 l  X+ Y
  29.     'Connection':'keep-alive',
    : ^; S' ]9 B) N( B& h* `+ c
  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'
    . P+ N' r8 M8 q8 U% B( w8 o
  31.     }2 [; T+ O( g! G8 k# V$ _
  32.     crawl_config = {) x( ?) J) o# h# b8 w8 d5 M
  33.         'headers' : headers,& R. n1 i; t5 j+ f! b
  34.         'timeout' : 300
    5 T# Z  W& S3 S( O9 k
  35.     }5 _$ p; Y. |' a& \' Q
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):, k5 x3 ]- U0 K- {( n. W7 {
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")0 j, }7 B( }# G( b. X7 ?
  38.         try:
    , k$ @- t# }. s
  39.             cursor = db.cursor()- o( x* J8 i: g8 L
  40.             #注意此处字符串的占位符要加双引号"%s"
    ) k8 G5 y- M! P1 q
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);) C* i) j9 f3 ]! {2 h- R& `
  42. #            print(sql): L. }; \# j$ \( A/ N: c2 L9 }
  43.             cursor.execute(sql)
    # k6 E/ P9 O( a  y7 {
  44.             1 I) P+ I- z+ [/ Z
  45.             #qid = cursor.lastrowid7 k3 R' n; i, K% @
  46.             #print(qid)) y0 F! Z/ M& u
  47.             ; e5 T' p- g( }
  48.             db.commit()
    : U( L; ~+ z2 b" V1 C
  49.         except Exception as err:
    2 `) y* @" q9 G# O
  50.             print("Error %s for execute sql: %s" % (err, sql))7 P! |# b" Z7 t+ S
  51.             db.rollback()
    " u9 v: W! A6 T) j1 x
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    0 D' H" D8 K4 I  X1 v6 |
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    , c% O5 m; g, I( }: j) I7 R7 [
  54.         try:
    , H  z, F$ b2 G8 f
  55.             cursor = db.cursor()
    4 Z" c8 D8 e! q2 N: H6 |
  56.             #注意此处字符串的占位符要加双引号"%s"
    1 A6 E9 }2 |: P: z8 i
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);0 }  g/ |. P9 v! S9 ]0 k' l) {
  58. #            print(sql)# H, ~6 e! j# D2 G& n4 t9 I
  59.             cursor.execute(sql)8 m$ L3 v& J+ I# h+ ]! ~
  60.             & b* ~4 J5 l& \. @! W
  61.             #qid = cursor.lastrowid/ l% t. Q" E3 q" @- s
  62.             #print(qid)
    3 W# E2 d& i1 o+ ?3 H7 E, v$ v
  63.             
    4 Q3 p- Y5 i3 o+ C) \0 x
  64.             db.commit()
    0 ^1 M8 F* v8 i& y3 R
  65.         except Exception as err:
    1 _  m" g+ f" H, }  J% K/ t
  66.             print("Error %s for execute sql: %s" % (err, sql))" D0 Q7 H, ]+ v  f, I; G' y
  67.             db.rollback()
    ' P- U) A; T& L, F5 t
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):5 O' g* I% J: F# z# p9 p
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")1 _. [0 n% z3 k( j' y. r3 @
  70.         try:6 `9 `8 q/ F. B# R, `, r/ O# o7 ?
  71.             cursor = db.cursor()
    , j. L4 V, N6 v( m+ S
  72.             #注意此处字符串的占位符要加双引号"%s"
    - U' p  g! |" `$ l) t; u
  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);
    % q2 k- r$ t$ Z0 W
  74.             print(sql)0 m$ r6 ?6 D0 g$ @5 z
  75.             cursor.execute(sql)6 d0 j  ^* y- Z$ O
  76.             print(cursor.lastrowid): m. O& @6 g" ]2 A$ ]
  77.             db.commit()
    3 ~1 Z! b4 _% T" c1 d0 R( |
  78.         except Exception as err:
    2 |$ b  H; V) ^+ I: x* g  e) t0 S
  79. #        except:
    , n5 v2 X5 P% y1 R0 L+ N
  80. #            print('Failed'): w' N4 G. F9 f$ I7 C9 j8 N
  81.             print("Error %s for execute sql: %s" % (err, sql))6 m3 m8 l; W+ c. v! R. P* T
  82.             db.rollback()
    5 U! x" U# z7 _! I1 L0 D
  83.         0 t+ ~0 K  Y6 W, G$ `4 x
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): & S, p/ z' |* U
  85.             reload(sys)
    & v4 y  i2 h% x# D- `0 M
  86.             sys.setdefaultencoding("gbk")$ i7 P0 m/ C" G  V$ W) U# ~1 f
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    8 p) E, M. C1 I6 O
  88.             locoy_data = {
    9 [( X" `6 ^7 l2 m. E# i
  89.             'my_u':'用户名',   #后台用户名
    & `0 ]( _0 t( k5 B! S+ G
  90.             'my_p':'密码',   #后台密码4 |9 z$ ?% T. {3 s& F
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    ; p& m7 U3 z* F; n; z) {' D$ |
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),7 K& a' L9 m  }# \9 Q& O% W' D
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),- m3 G6 Q$ D0 Z3 Q$ v
  94.             'article':BookConte.encode('gbk', 'ignore'),
    4 X. a' g+ f' c8 \0 r- H8 a
  95.             'author':Book_author.encode('gbk', 'ignore'),9 }# g' F* \7 o; n: g. S: C2 i
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    ! K; r  f0 u0 t& M; E/ H: y
  97.             'thumb':Book_img,' q% d: R: j1 c
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    % K" |( B1 Q) l" p9 z' k* t
  99.             'abover':abover.encode('gbk', 'ignore')           9 d: ?7 ^5 U4 @/ N9 ^
  100.                 }/ Q- v% x- g4 o2 _* R
  101.             res = requests.post(locoy_url, data=locoy_data)$ T1 L, H9 V) W6 T
  102.             print res.text
    * c' _- M8 k$ n  _8 a+ u, W
  103.             print res.content1 D6 h0 ]3 v: |8 w- z! J; y! M. ?/ K
  104. #            print Dsd
    & S- X% F, Y; n- F. b% }
  105.             return res5 w9 {7 M6 d6 m6 e
  106.     0 G4 @5 ]( J1 |8 a  j/ _
  107.     def __init__(self):
    : C0 Q% w3 K& s1 o# c; u
  108.         self.base_url1 = 'https://www.****.cc/'
    & ~; [/ Z2 u7 ]6 j% Y8 P6 q
  109.         self.base_url2 = '/'
    7 k2 s7 m' ~  R9 _) K2 H) @# v
  110.         self.CaterId = []% W0 O  f+ f6 f) A9 a8 R$ b
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
      M& q6 c1 T( ~% z; L, b& ]
  112.         self.page_num = 1+ ?# _$ I4 W3 }4 s. F" T( b1 ]
  113.         self.total_num = 200   7 k( o) X1 i2 Y* e2 f+ s8 X* y
  114. ' o6 x8 d1 c1 _! g- u  }. l
  115.     @every(minutes=8 * 60)% X9 g) F6 V4 ~! U( f. k' L/ A
  116.     def on_start(self):  a, Q( N3 F7 w+ g3 {7 E
  117.         global Cater_Name
    ; O  w) _* C5 h5 J( i
  118.         Cater_Name = []
    / q4 u* S7 A/ g
  119.         while self.page_num <= self.total_num: ( s# ]! \% j' d  w; V
  120.             for self.CaterId in self.CaterIds:  @* h/ V6 x9 n4 I! n
  121.                 if self.CaterId  == 'xuanhuan':
    9 Z. F  ?% I; n3 x
  122.                      Cater_Name = '玄幻'. j( ]" d& L! U, v! R+ f
  123.                 if self.CaterId  == 'wuxia':
    6 v2 T- x. c+ z. s1 T
  124.                     Cater_Name = '武侠'
    + E  }; f3 w8 W( g* ]8 c0 f9 m& ]: }
  125.                 if self.CaterId  == 'lishi':, _, T( c* a% A5 K! z
  126.                     Cater_Name = '历史'            + N: C- r: z' t; Y
  127.                 if self.CaterId  == 'yanqing':
    8 C: T; r7 E( n
  128.                     Cater_Name = '都市' 4 e+ J/ d' t7 z* K$ P, Z& k
  129.                 if self.CaterId  == 'nvsheng':
    7 L% Z6 k0 e. _; M: i+ R- I5 ]
  130.                     Cater_Name = '都市' 1 w' n  w8 x( Y# @
  131.                 if self.CaterId  == 'kehuan':* v4 U0 w2 E$ C0 Z6 Y- [9 S
  132.                     Cater_Name = '科幻'
    ( p6 t0 @  j  a* J3 U! G
  133.                 if self.CaterId  == 'kongbu':' R( _$ C1 G! q; q6 W  X2 V9 Q
  134.                     Cater_Name = '游戏' . b7 T/ O) X  w* Y( H7 l+ d- B
  135.                 print self.CaterId
    # v$ I- n' a6 M' l" A6 j
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          + O" L8 k8 F  P  Y. `- L% g' Y
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)1 q9 S. f0 f$ k) q
  138.             self.page_num += 1 ' A) W6 a3 Q2 v8 I% Z% D
  139.             ' V( A) o0 F3 p' K( p7 a5 m8 B
  140.     def list_Caterg(self, response):' L. k( |7 x4 t: L( x9 B# s! ?
  141.         Cater_Name = response.save, w9 F  }. K, T! s
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    * d9 ^/ n; B. D/ Q) ]9 D+ n& L, w3 Z
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)+ E- P% r- w* u" `3 u
  144.             % \& q0 m# p- ^0 O+ Z9 \3 S
  145.     def list_Caterg_detail(self, response):$ {' H" I# p- R$ [' W+ C
  146.         Cater_Name = response.save
    : b: S+ ^: U* K0 ]1 Z0 _
  147. #        print Cater_Name; H; i/ n& L  l& u# \
  148.         Bookname = response.doc('h1').text()6 D" d* u% @: s9 u8 Q1 P2 E
  149.         print Bookname4 ~5 I0 N4 {, w7 \7 q
  150.         Book_author = response.doc('.authorname > a').text()1 e  @9 v+ O: Y
  151. #        print Book_author
    + m3 P7 B- S4 o/ C3 U
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    4 w: i: K; J+ z) e- }
  153. #        print Book_Introduction
    4 H% F6 u% x* d/ B4 \
  154.         Book_Synopsis = response.doc('b').eq(1).text()- g( @8 @- O$ [* J) n2 S, ^
  155. #        print Book_Synopsis/ O  a. k! M, @
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    # H# Z; r  z9 A8 Y5 M: r
  157. #        print Book_Palabras
    8 f! f2 P# j; C
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
      Y1 K. x; y+ ?9 _
  159. #        print BookIDs
      s6 ^+ _  c9 o2 [: a
  160.         Book_Dates = str(datetime.datetime.now())         * J$ f* D  w; J" q8 g
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():( I# F% Z! b- z( L  r7 }- c
  162.             img = imgs.attr.src
    + ^+ h# d* g" \# O2 z
  163.             print img; u. ^3 v- e5 i2 l( u' q) g0 r
  164.                 #小说封面下载
    + q- u+ I' M  }" X; M6 l* w; m! d
  165.             extension = self.getExtension(img): }+ v4 Z# L* f. t& {5 s; }
  166.             name = self.getname(img)
    ; Z" X7 `4 F# A! ?2 h* v1 @7 g0 l
  167.             file_name = name + "." + extension
    - l3 s; F- ^' u' G1 Z  y
  168.             imgDir = P_dir + name8 [* r8 K3 O: e6 r
  169.             Locaimg = imgDir + "/" + file_name5 I, a  M8 x/ I: J1 E
  170.             print Locaimg  _! s% ^2 [& K9 k1 X5 p2 l
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地( n7 l+ V9 R5 V0 M; m
  172.                 print('attachment url is ' + img)               #
    ; S9 y& I3 O. ^7 @7 `, u/ i( C7 O
  173.             Datos = {1 o# B8 ?4 I6 m- ~6 ?0 U- ^, h
  174.                     "Cater_Name":Cater_Name,- U7 j; m" T7 I: ?2 k: ]2 Y
  175.                     "Book_author":Book_author,
    & x) ~# F; k7 C& v' U1 b+ e& ]
  176.                     "Book_Introduction":Book_Introduction,
    + }7 |" a7 y/ x% x, V+ x  n7 X4 D: S
  177.                     "Book_Synopsis":Book_Synopsis,
    ' j( ?! L  D' S0 B6 x9 n
  178.                     "Book_Palabras":Book_Palabras,# f: `3 T8 }8 P
  179.                     "img":img,
    0 m; X  u% o4 i. d1 g( n
  180.                 }
    ! z$ @; h) `$ j" r, t( V
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    * J! }$ A' O# c  O$ P' w& s& T
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    4 |# t6 \3 `: l/ L. S2 Y
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)5 I' y- t" s2 c0 m) G
  184.             0 s1 h/ ~, A( p7 Z( I6 ?" S' \
  185.     @config(age=8 * 60 * 60)   
    ; P! d6 n2 ?: C! c
  186.     def index_page(self, response): 8 ]+ G. D) E# W
  187.         Datos = {
    ; Y& `. f7 d' x. e' E
  188.                   "Cater_Name":response.save['Cater_Name'],+ a% G: {9 q5 V% A
  189.                    "Book_author":response.save['Book_author'],
    2 F" I6 N0 n" V) @* t% m( B
  190.                    "Book_Introduction":response.save['Book_Introduction'],. {- C. D# a% R- G4 [+ c' @
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    * N; \: _) v2 C* k# ]
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    ! F3 @2 R: k% \0 g4 [
  193.                    "img":response.save['img'],
    . j) U/ k3 U/ j! l+ r+ |/ h  K
  194.                      }
    + \0 m1 K9 p9 }" y
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    " C* m, D# X9 ]3 |' r! V
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  $ u5 m8 p) K0 N! x0 O
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)7 i$ Z! A3 t  U9 L" v( c% L# n
  198.     @config(priority=2)3 z, Z$ T! L+ z8 E, f1 E
  199.     @catch_status_code_error
    , ], \9 p$ R% s/ C5 `1 K
  200.     def detail_page(self, response):        
    + _1 z1 Y5 b8 n( K
  201.         NewRe1 = u'哈书'
    ( p; O8 \5 P4 \7 d2 L  g. d( V
  202.         NewRe2 = u'huhjsd.CC'
      _. a& r+ q7 `8 |: n, Q
  203.         NewRe3 = r'^\\n\\n'
    / Q9 u. W5 q3 W8 J  [) O  f6 X# ~
  204.         NewRe5 = u'小说网', T9 I% h7 ]  Q9 t9 \
  205.         NewRe6 = u'fgdfgf'
    & G! }: R, A# C3 K/ Z, L
  206.         NewRe7 = u'fgfgf'6 c! |1 e+ T3 h4 o5 ^
  207.         NewRe8 = u'ffhgf'
    8 |. W/ T- c: M$ k, T
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    6 J0 @; H, |" I2 r1 W
  209.         ReC1 = u'静思'" o0 ]5 O; w; ]8 v% O+ N5 T' ^% @6 d  U
  210.         ReC2 = u'aghgf.com'
    $ i. \. T0 I! g+ o. H* p6 Z
  211.         ReC3 = u'aghgfh.com'; G' g9 T7 B  a2 n
  212.         ReC4 = u''( k  \2 W3 w9 B
  213.         ReC5 = u'文学网'
    0 ?  g# q) H* h+ j" N( |
  214.         ReC6 = r'<BR>'
    0 r, M* S! W& B* S) D+ G! Y
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    / \8 _: u, R/ H" {
  216.         print Bookname
    ! E) y! }- d  e; o3 v& \7 w8 T& m4 b) ?
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类  C% b# [3 u9 r# v; G/ L$ `
  218.         Book_author = response.save['Book_author']   #小说作者
    1 T( U! F8 u. R2 t4 Y
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    9 T0 K; m' p4 Y5 {
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新6 d3 o$ n% Y/ o" V# h9 T
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数8 A$ f' Y" H  l4 m6 f* u
  222.         Bookurl = response.url   #小说网址/ g1 F+ C4 F- _' a
  223.         Booktitle = response.doc('.article-title').text()   #章节名称$ X4 X; E4 w" u( N. _8 r' v3 d
  224.         BookID = response.doc('.readset-r span').text()   #小说ID  y2 d2 a( V+ [& K
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容" @" p! e1 I' w1 ]
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)6 j% e! C/ w' E
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间; m7 u# e: e8 z  ~& i& t1 p, V
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    0 q$ R; Q/ F; N& {+ Z
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)% T( ?, H( @& s( b
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)% N& d6 c$ @0 C& Q0 P+ U
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    5 e9 S# s2 b9 P$ ^2 `
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)$ `& d+ B9 J9 o4 L8 o
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    $ z3 I9 U6 g; t
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)- l; J8 A9 c4 ~
  235.         BookConte = BookConte4.replace("\n\n","<br>")
      N. G; P2 N6 f: p. J
  236.         print BookConte" [% Q9 f6 n) p" P5 p1 u+ N5 Z
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)$ {3 G+ Y( z7 z7 e' R
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    % b9 |' ^& _. ?$ Z4 O
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    7 N! e! `( X/ v5 D: G7 a) k$ L
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    6 s' ]! c& Q5 C
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     : r6 h! m7 f) n% w) f) F  E* {
  242.         Book_img = response.save['img'],  #小说图片6 \8 ~8 y- `' J
  243.              - [! s0 D- v3 M9 N
  244.         #insert into MySQL 小说入库
    8 r! S) p; w( S
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布# o" a" d1 F0 S/ S7 v7 X0 J
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    ; y) Q) E  [' n! ]
  247.         #post提交发布: p- a( Q6 d8 ^. M. F8 n% j& d
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    6 R! c7 B7 T7 r/ y( ?/ r, E( X
  249.         Datos = {
    ; {( i4 J7 s' X
  250.                   "Cater_Name":response.save['Cater_Name'],5 ?4 g% m2 }! J# R( j6 i
  251.                    "Book_author":response.save['Book_author'],
    1 c5 ?0 R4 O9 y) d6 R4 A, U
  252.                    "Book_Introduction":response.save['Book_Introduction'],  f: @, j; R' S2 Z! m3 c; B
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
      s- a7 L2 z6 p
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    ; @) K6 ~* I. r& @1 g/ r
  255.                    "img":response.save['img'],3 a, F3 Z  y. z( ]+ X$ d5 ~% E+ w
  256.                      }: y' Z* C" \/ Q# o6 G  I/ @. f
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    + n1 I' W! |0 r) X, \' e0 t$ ?
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) ) _" N% @4 ~( W. ]7 Z
  259.         return {
    % L( ^! T9 b4 T8 V) U* Q6 Q
  260.             "Cater_Name":Cater_Name,% u0 Q6 j0 ^% U- b4 ]8 w3 [  c6 A* l+ P& k
  261.             "Bookname":Bookname,) D& u$ @9 q, G* }. e
  262.             "Book_author":Book_author,1 b- f1 B3 N, y1 [
  263.             "Book_Introduction":Book_Introduction,
    ( j, Z  w. Q: r) a. `3 G8 w3 q
  264.             "Book_Synopsis":Book_Synopsis,
    2 d! L& F! s5 A4 Z. Y6 @. V: K
  265.             "Book_Palabras":Book_Palabras,4 u5 h4 T$ e: e% h5 x6 x
  266.             "Book_img":Book_img,. T: Z* ]6 H4 D
  267.             "Bookurl": response.url,2 r* D+ I0 |  _* B) i! X
  268.             "Booktitle": Booktitle,% A0 T. e3 H; {9 [$ p2 W
  269.             "BookID": BookID,
    3 x" P; X" K& I$ e" H
  270.             "BookConte": BookConte,
    ; `2 g; c  V' W' t# ]+ O
  271.             "Titleid": Titleid,. I+ j$ S2 i8 _: N) D! o
  272.             "abover":abover,; X" r% P+ @& ?( m% \
  273. #            "Book_Date" = str(datetime.datetime.now()),  u5 I; g# R( B$ V
  274.         }6 P  a( d+ p) E- ?
  275.     def download(self, P_dir, imgDir, file_name, Book_img):. {: D8 v. x. z+ a$ b: d
  276.         if not os.path.exists(imgDir):
    , \6 Y- B3 ^% |& U6 A' D
  277.             os.makedirs(imgDir)
    , p2 d, y" u+ o; o# U7 K* S
  278.         file = imgDir + "/" + file_name
    ' a, R8 s( X5 h8 X0 {6 `
  279. #        print file
    $ N( |$ z. P0 E9 u
  280.         f = open(file, 'wb+')
    8 T2 f8 T3 ^8 Q, L
  281.         imag = requests.get(Book_img)
    6 v% D$ }2 P4 X" t. j* @2 ~2 }% d
  282.         f.write(imag.content)
    , D: P* J- T) a" h
  283.         f.close()+ V2 J1 B, ?* ]' T  {" {8 s3 g" M
  284.         #保存图片前& t2 \  @" z6 w6 G. V
  285.     def save_imgs(self,response):
    7 d+ x! h6 }9 }& g2 j
  286.         content = response.content1 g, k- y7 t, k8 Q# E
  287.         file_name = response.save["file_name"]3 h3 t* I# O+ U6 T8 O
  288.         imgDir = response.save["imgDir"]" R( a5 r9 L6 v* f1 p" w" b
  289.         file_path = imgDir + file_name
    7 a1 a9 T. F' H' Z2 w
  290.         self.save_img(content,imgDir,file_path)0 y5 _; }0 g* l6 i' v
  291.     #保存图片
    , P! L  g' j. k
  292.     def save_img(self,content,imgDir,path):2 e* t' Z3 b& Y; j
  293.         if not os.path.exists(imgDir):                        
    . U8 C0 x' E, h# s5 l8 R
  294.             os.makedirs(imgDir)
    9 x( C! b% H5 ~, E+ ^; R. T! M
  295.         f = open(path,"wb" ): x" t% B" D8 p
  296.         f.write(content)  D, m; i) O) G# D
  297.         f.close()
    + o% I" {5 N& g& U! I! B
  298.     #获取url后缀名
    . d. W0 ~$ I1 G. ^2 b
  299.     def getExtension(self,url):                            6 B, k) [0 \5 V
  300.         extension = url.split(".")[-1]
    1 x# g) I$ e0 ?
  301.         return extension
    - X3 R% w$ F( v9 @0 W
  302.    
    - t4 e6 n* B) C- l
  303.     #获取图片名
    % X9 ~1 R3 _0 c1 ~5 e6 e& G
  304.     def getname(self,url):
    ' @2 P9 t" B6 y3 n+ _
  305.         name=url.split("/")[-1].split(".")[0]
    ; [: P- {; Q+ w( _& L5 y
  306.         return name
复制代码

- ?9 t& A3 f  B' u7 p, Q( V

7 e$ R# |+ C3 b9 c- ~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-7-26 12:46

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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