找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
$ q* \7 S# s* H5 N
  1. #!/usr/bin/env python8 r7 K$ Y  N5 l2 a% F
  2. # -*- encoding: utf-8 -*-) |! b$ \% S. g% h' E& j
  3. # Created on 2019-05-05 21:43:11& O! j* |" p. ]- K& P7 w# X( f
  4. # Project: XiaoShuo
    8 S1 m# x+ ^- ~5 G8 Z( d" y( S

  5. 0 M1 ?9 p: _9 W) k
  6. from pyspider.libs.base_handler import *
    3 ]" R: ~4 G  D  K8 M
  7. import pymysql
    : A9 x' p  }( @* v9 @
  8. import random2 G4 T( {  ~0 S& |. x2 G
  9. import datetime9 z9 C' u. q$ t4 |
  10. import urllib2,HTMLParser,re
    ' D7 ~  o+ B9 R+ N0 D6 o
  11. import os) f# @1 g- u7 W& m2 P
  12. import sys
    & m5 h) R  b9 P$ T  n
  13. import re, k; b' }3 B) f
  14. import codecs! ?9 \# ~) x1 i; C3 v9 G! n+ B
  15. import requests4 e, j  b7 R+ y8 n7 Q: e/ g% ~& d
  16. import json
    , ?/ H$ ]5 ^: @  b1 @" i
  17. . F. e$ ^& r' c' F2 M
  18. class Handler(BaseHandler):
    - w% Q7 X( y* l+ @7 u# h/ V& q
  19.     global Datos" G) e5 x0 l: ]: ~/ f( K
  20.     global P_dir   
    ; s0 [9 l* y" V; o6 V
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    ) L) ~" N$ i; }7 `0 N
  22.     global Datos
    2 @8 g; K- s$ n4 Z
  23.     Datos = {}
    ; e. [- O- o: {0 f/ [" q' ^
  24.     headers= {
    ( `) ^9 o& y2 P3 J
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',) B6 B; f+ t/ [8 m! U# H
  26.     'Accept-Encoding':'gzip, deflate, sdch',! \+ q: o# V: w2 T0 V4 E
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    ' W+ l/ n3 {: f! l+ I
  28.     'Cache-Control':'max-age=0',. e  ^# S5 W- a3 s
  29.     'Connection':'keep-alive',0 P  B( j! m. W  a) p) n
  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'/ r  @$ b* v, |4 |
  31.     }. j4 N2 N5 k) E
  32.     crawl_config = {
    8 Q7 a2 m! e) w. K' F8 s# r
  33.         'headers' : headers,8 Z0 c. p" ]) c1 s$ Y  @0 }
  34.         'timeout' : 300
    / f: F, |3 ^  ^  o% A' J$ B
  35.     }
    & Q( C% z! Q# R! ?
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    & P* W% C6 v1 o7 B5 R. a' c
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")) B/ p  f* @1 d& b. @
  38.         try:6 e) R& [' s6 s; T( ~1 o8 K. s7 f
  39.             cursor = db.cursor()3 h) _$ I  b: J+ j' e, d: a5 G
  40.             #注意此处字符串的占位符要加双引号"%s") H( G/ r, I- ?& [( ?
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);( p, e% t5 `& X1 U1 _. g
  42. #            print(sql)$ I+ M4 x: R5 ~# r/ k/ G
  43.             cursor.execute(sql): I; B2 }3 R1 U% J2 d3 @
  44.             
    / C2 `# w, A" z1 ^, K
  45.             #qid = cursor.lastrowid9 W% A# e4 `' e; ~" a
  46.             #print(qid)
    1 Q6 U! W" [4 {, r
  47.             
    , E/ b7 K) s5 w3 I* K5 \
  48.             db.commit()
    $ Q! N4 i4 X3 z6 `
  49.         except Exception as err:
    4 v5 o) d1 p' S- z
  50.             print("Error %s for execute sql: %s" % (err, sql))# u1 f( X+ j9 D& P" B5 n
  51.             db.rollback()
    1 N. U/ |1 o6 v, h6 P  o( G; e* K
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):* ?( s- r: {6 d' r! C% N, j! M
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")* u- d! C. Z+ e* {2 u4 _8 B
  54.         try:
    6 m) Z: Y" H: W& T
  55.             cursor = db.cursor()0 D" Y' [( G  G9 J- Q: w
  56.             #注意此处字符串的占位符要加双引号"%s"
      \) y' b, k7 {) A/ v, i* O1 I1 O6 [
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    4 s  t$ U$ q8 u- g8 U: k  @# [
  58. #            print(sql)
    # y0 N- m4 e, C' g5 J  s* X
  59.             cursor.execute(sql)
      K5 {1 r8 s! G1 ~, V/ B3 t) u
  60.             * z* |. B& l" n. X, ^. H
  61.             #qid = cursor.lastrowid0 [. E2 x7 b% p5 S+ [) D
  62.             #print(qid)3 q# p! J4 B+ t; n4 k; _
  63.             
    6 s7 e$ ~5 M* D8 S3 a; K, E
  64.             db.commit(), [4 U/ ?6 Z5 D: }, U- v. i) v: o
  65.         except Exception as err:2 f$ n: V2 [/ ^( ~0 U; a6 l9 P
  66.             print("Error %s for execute sql: %s" % (err, sql))
    % ^  @/ r& I4 g' U- V. n
  67.             db.rollback()
    2 N) q. B& [2 x1 w
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):7 F) w& p% z% Q0 x
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")6 {+ n" P0 D4 J. R) E
  70.         try:
    1 a$ M" O- O) m. [& p0 J" P& G# A
  71.             cursor = db.cursor()
    ; g4 n9 F. H9 Q
  72.             #注意此处字符串的占位符要加双引号"%s") J2 z; q$ I/ ^- N1 Q7 G; F0 b
  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);
    / @: g- y% D" r3 n1 m, M# B( n. i" {
  74.             print(sql)7 h4 F5 g+ f& p' i2 ^( t7 @
  75.             cursor.execute(sql)
    6 Z( Z" p& i; G- U' ~5 F& Z# s* Q
  76.             print(cursor.lastrowid)
    . n1 L1 e" u% p4 D! t
  77.             db.commit()
    2 Q' _' O: y2 `/ g
  78.         except Exception as err:
    + S1 a1 Z# D' c# G5 |& [9 k  J1 V4 ~
  79. #        except:
    8 p- ~% _2 j6 c' C
  80. #            print('Failed'). O0 E( H* E6 Y/ Q
  81.             print("Error %s for execute sql: %s" % (err, sql))
    6 {, w1 I( V, Y& z# z# C8 j9 ]' |
  82.             db.rollback()0 g% R% B- L# g, w
  83.         , l9 x. g" L) X  a8 C+ m0 ?
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): 3 [+ Q) z5 Z- _' @2 x3 P! T5 k
  85.             reload(sys)
    * B. s$ I3 B+ Z$ K+ O+ p& w  p
  86.             sys.setdefaultencoding("gbk")  |  Q! m, z& }: E* p9 e
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址- I. @) ]) T! v0 u5 ~7 k8 A
  88.             locoy_data = {* M1 h& Z+ K0 I) {. q$ N
  89.             'my_u':'用户名',   #后台用户名
    5 |: U; N1 a# [: s" N
  90.             'my_p':'密码',   #后台密码* P8 _7 j8 R4 O! V# s
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),  g: Z7 t5 `6 j  B8 f
  92.             'caid':Cater_Name.encode('gbk', 'ignore')," l4 D' j$ \/ t
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    3 c. b$ X8 `* k  m! R2 D
  94.             'article':BookConte.encode('gbk', 'ignore'),
    ; w& w2 o  f% _' `1 U2 z
  95.             'author':Book_author.encode('gbk', 'ignore'),
    ( ~, B. x( i7 C3 ~# l9 g6 H
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    . T) k6 G/ g1 G# C& b3 ?. U
  97.             'thumb':Book_img,
    & l2 e  A' x: `, o
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),3 s' i, Z, N5 T1 ?5 W7 C2 \  u
  99.             'abover':abover.encode('gbk', 'ignore')           
    7 {0 B: J; q% h2 ^4 x* e
  100.                 }7 y5 f4 D7 @! n4 C# f
  101.             res = requests.post(locoy_url, data=locoy_data)
    ' s8 V4 {: Z0 L% a
  102.             print res.text; n) t" C4 {7 `3 |; ?/ a* _) i
  103.             print res.content
    ) c# p% j3 {: y$ g- N2 X
  104. #            print Dsd
    7 i8 \! q: d! E2 @: s/ D. k6 }
  105.             return res( G2 O/ `0 T1 Y! a8 O
  106.     - i$ T9 _' R) M, ]# L( r: H, e
  107.     def __init__(self):' y& E/ v  Z+ f
  108.         self.base_url1 = 'https://www.****.cc/'! s1 h( K( o( W9 l1 ~+ X
  109.         self.base_url2 = '/'
    4 F2 }! D2 O3 B$ {, @$ M% ^
  110.         self.CaterId = []/ u8 z5 G# @8 ~1 b8 o' W
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    0 K# C: o$ z' x; u, t
  112.         self.page_num = 1
    7 z) W" m. ~: G, q, I7 t; `- O
  113.         self.total_num = 200   % c6 M  G3 U1 C4 \" b

  114. ! i. ^! V; n  U( i3 u5 K
  115.     @every(minutes=8 * 60)  ^9 G9 z1 u" I, p
  116.     def on_start(self):( S8 _) H+ s4 B
  117.         global Cater_Name* v* z( [5 O% d7 ~- c( X
  118.         Cater_Name = []
    7 h; W) l6 ~0 R+ I& ~
  119.         while self.page_num <= self.total_num:
    # Y/ w! J0 V! \6 H8 Y6 x( ~8 u
  120.             for self.CaterId in self.CaterIds:8 D$ z0 A5 Z; i/ \
  121.                 if self.CaterId  == 'xuanhuan':8 w+ l# D4 L$ h: G- L- M) P8 L) f
  122.                      Cater_Name = '玄幻'
    ) X/ \* ]4 z* }" T4 P
  123.                 if self.CaterId  == 'wuxia':1 g+ v1 u2 t' D! o( F3 W& A2 g4 n/ C
  124.                     Cater_Name = '武侠'; b) S$ h3 ~/ X% k, N
  125.                 if self.CaterId  == 'lishi':
    ' }3 J% b5 g! V4 }. `. r! i5 M% n5 Q. F
  126.                     Cater_Name = '历史'            , _% e  x5 O% L3 Y1 P
  127.                 if self.CaterId  == 'yanqing':
    9 C; x) {. q. h8 e+ t: q
  128.                     Cater_Name = '都市'
    9 I0 [& X6 x) x6 l/ Y
  129.                 if self.CaterId  == 'nvsheng':1 F8 a! M$ v$ [9 j
  130.                     Cater_Name = '都市' , i; _* F7 a4 ^3 l0 N7 X
  131.                 if self.CaterId  == 'kehuan':
    , s' O2 V3 c$ W' C
  132.                     Cater_Name = '科幻' ; V0 v# F, A& W
  133.                 if self.CaterId  == 'kongbu':
    & [1 v' r9 k$ S
  134.                     Cater_Name = '游戏' 7 m0 C4 Y- j! o& Z! P) P0 I/ m
  135.                 print self.CaterId+ Z1 A& x( q* f) a
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    : w$ B3 W2 M8 n- Z7 D
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)) L% j  O# ?+ O1 j& Q
  138.             self.page_num += 1
    # M! x. G% P$ w2 u2 x
  139.             - R2 V9 |. L' e# t# k
  140.     def list_Caterg(self, response):: ^* i& ^5 _5 N6 M& p1 E7 I
  141.         Cater_Name = response.save
    + ?$ G7 G) W' E" L, K' i' K
  142.         for each in response.doc('.pic-list a[href^="http"]').items():- L6 z  i9 A0 l! |! u- k: }0 z
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name): T& t  M2 H5 ^# y3 A- \2 d
  144.             
    1 d# {# a+ {8 t. |
  145.     def list_Caterg_detail(self, response):- s0 q8 q# D$ w
  146.         Cater_Name = response.save
    / N% U8 _, @2 u! F8 n( z
  147. #        print Cater_Name
    2 l" _9 C  r& [! [2 O  G, L
  148.         Bookname = response.doc('h1').text()% [3 c, I$ r5 S8 w
  149.         print Bookname0 R$ o- w4 K# c) l
  150.         Book_author = response.doc('.authorname > a').text()4 M- U3 Z* }& @  L1 `
  151. #        print Book_author8 V% v4 z* G/ P: O) V
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    9 n; L: h% F4 I- n
  153. #        print Book_Introduction
    , ?, Q5 j8 N4 s0 b
  154.         Book_Synopsis = response.doc('b').eq(1).text()7 g) l& u; ^# m1 M/ H- I) t
  155. #        print Book_Synopsis$ y/ m( c. `* l5 Z/ q- d* e4 T4 L
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]3 @6 K5 h6 x% s/ B( S# }
  157. #        print Book_Palabras
    / a4 R) x5 Y/ k0 h" C
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID7 D) l; G2 v) e2 u: u+ Z7 p0 u
  159. #        print BookIDs
    1 w6 E0 A' n" J1 M2 \# h' k
  160.         Book_Dates = str(datetime.datetime.now())         $ ~5 ]1 T% J  V, H3 ]9 T" s1 L) X
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    - ?0 ~, P$ C4 b' }) H
  162.             img = imgs.attr.src) K# _. h1 _, z* [! R, ?* H
  163.             print img
    ' q* @. l+ r6 W0 C6 s" A0 j
  164.                 #小说封面下载
    2 X! k! r& S% V5 m( c- A, r8 j
  165.             extension = self.getExtension(img). h' l. q9 a( w1 _# S% Q
  166.             name = self.getname(img)4 P# T' s, a, B! c& u( ]# P
  167.             file_name = name + "." + extension# N$ l5 [+ b$ }: c, U% F
  168.             imgDir = P_dir + name
    ; M7 u% N) f) b
  169.             Locaimg = imgDir + "/" + file_name6 t2 s2 P4 n, N, x6 a/ T3 \$ c! t
  170.             print Locaimg: w5 _7 d& ]4 v0 m5 e9 I
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    3 x  ?- J! j8 g, _! i. w
  172.                 print('attachment url is ' + img)               #2 Q+ Z% _; F* s/ m& d" @
  173.             Datos = {
    8 u" S& G7 `- F, e, [
  174.                     "Cater_Name":Cater_Name,- @7 t, z) S* K1 ?0 ~+ U
  175.                     "Book_author":Book_author,/ B9 i5 B. W# J& I+ j
  176.                     "Book_Introduction":Book_Introduction,
    4 T# k) `, w! d
  177.                     "Book_Synopsis":Book_Synopsis,  ]1 G" E5 S$ P7 X( N# r
  178.                     "Book_Palabras":Book_Palabras,
    5 H1 k- |5 t5 s0 \$ |, C
  179.                     "img":img,& [# v7 _3 m! ^" Y0 r
  180.                 }
    - N& {& g3 v6 Z/ ?8 u
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布% a. p( Y: U6 ^' V
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():6 }, F; I9 a* G* [: K* M2 \1 B
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    8 s, w. p+ v+ |/ L
  184.             
    * G# ~; P# T3 }5 E8 |* ]
  185.     @config(age=8 * 60 * 60)   
    5 P) A' G- t' b+ [0 N
  186.     def index_page(self, response): + F4 Y1 P. A( U
  187.         Datos = {  ?8 ~! z. e+ R$ _' _, C+ N( d
  188.                   "Cater_Name":response.save['Cater_Name'],
    $ I5 c& x2 D9 I$ Y
  189.                    "Book_author":response.save['Book_author'],
    % [, D1 _! Y& n6 E
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    , R6 h1 X& D3 R. W& T0 h
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    - F. X3 ]  T# ?/ Q- {% B+ H% F
  192.                    "Book_Palabras":response.save['Book_Palabras']," ]5 t9 t9 {: p  h: b, {; F  w7 t
  193.                    "img":response.save['img'],# _) I, z8 r, k
  194.                      }" K* a( \( |. a' C' N- m
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():  r! k5 l- m  W
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  ; o  l9 |& E1 v& Y, D
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ! \, u9 y; E* B+ Z2 U- i
  198.     @config(priority=2)
    9 l" p8 G% x% r) B9 l; {
  199.     @catch_status_code_error
    * b# R3 w# d; Z6 |. e$ G
  200.     def detail_page(self, response):        " |& Q* x6 ^& X' B% R
  201.         NewRe1 = u'哈书'3 {$ c1 ?" Y7 {: z5 c) E- e
  202.         NewRe2 = u'huhjsd.CC'
    6 W* ~1 w0 p! ]. J4 `0 S4 V
  203.         NewRe3 = r'^\\n\\n'
    . H' n0 T# o* A
  204.         NewRe5 = u'小说网'+ U" W- c$ @* H' x: m
  205.         NewRe6 = u'fgdfgf'
    + t2 \( \6 K/ r* y5 b" w# d2 r
  206.         NewRe7 = u'fgfgf'
    1 Q9 Z( U  v7 ?6 ~/ k1 `
  207.         NewRe8 = u'ffhgf'$ e( W/ q7 s6 s* Q  J; T+ g! V
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'0 a* Y+ ?* H! O4 Q" t/ r7 l1 y
  209.         ReC1 = u'静思'
    2 ?* a! L: @& x
  210.         ReC2 = u'aghgf.com'% Y6 U" p6 G1 G. Y2 M; F
  211.         ReC3 = u'aghgfh.com'
    9 P5 E" Y! e) {0 x# P/ ?$ _; G
  212.         ReC4 = u''
    1 q8 H+ l$ J1 ~% O% o
  213.         ReC5 = u'文学网'- H- P5 X# s$ ?" ?
  214.         ReC6 = r'<BR>'
    / _0 n, d' V6 e, G2 r: ^# G
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称3 ?8 d( T# T* z5 f) M% t
  216.         print Bookname# D( C# E, p8 H& Y* B, L' l
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    7 ~- N" b& N) B
  218.         Book_author = response.save['Book_author']   #小说作者
    2 N, Q0 E7 y8 O! o
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    ' _$ |8 B2 P8 V- q% c
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
    8 ]3 N& @, h0 v2 C
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    7 ~. K6 k2 q, z* j
  222.         Bookurl = response.url   #小说网址' W9 t6 s4 B2 D+ O( \( ]
  223.         Booktitle = response.doc('.article-title').text()   #章节名称- n0 W: ]- \5 ]+ `
  224.         BookID = response.doc('.readset-r span').text()   #小说ID. a1 H6 Y5 S" K: H5 P
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    - y  R6 P- Z: C0 b% `! H
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    ; p" @0 }* S4 A# ~- \1 x4 k
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间# U+ N3 r) X" S9 v6 s, K
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    2 V6 C+ I2 w8 p, o4 p' I
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    1 Y0 _# l* k" f; a& ?$ \
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    9 A6 o' I* }* v- G; {% B- a- F5 j
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    ; l7 ^' T$ K2 d6 q+ k4 R
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    % \2 E2 Y% u% o0 Z9 ~
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    ; f! N5 D/ V& C8 W$ G, |- {1 B' f+ V
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    ! M8 Q9 P0 w$ r4 v$ x( X$ e; p
  235.         BookConte = BookConte4.replace("\n\n","<br>")7 G( S0 s/ ~" a0 H" @6 P3 v
  236.         print BookConte* K: L' u: i5 l! P6 |% N: O
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    : N! _, y: \6 s
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)8 S# x& J1 O! y! W
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    7 o9 s, D  }% a" s/ H% y% x
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    , D5 g/ @8 k0 t) x/ Q4 T
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     ' d: V- q! w! K: Z
  242.         Book_img = response.save['img'],  #小说图片" t' [% ~+ X/ z; r
  243.              / V4 E5 T( @5 M6 k+ x
  244.         #insert into MySQL 小说入库
    6 d, i6 K& a& l. |( h
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布. g1 S: e6 v5 o8 K- E4 i6 z2 L
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    4 U# f2 Q# A( `( k
  247.         #post提交发布
    % O5 o1 N9 p: z
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    3 K, T  I8 D9 N2 h( `2 z
  249.         Datos = {* q8 A  Q- H: p% n! y' H" w" ~
  250.                   "Cater_Name":response.save['Cater_Name'],
    2 q) p) I$ v; i6 W
  251.                    "Book_author":response.save['Book_author'],8 R# ?! M) s( j9 e
  252.                    "Book_Introduction":response.save['Book_Introduction'],' r5 G: F9 p% s  X$ r- ?& |1 a/ k
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    * e# Y7 P: @+ Z  T
  254.                    "Book_Palabras":response.save['Book_Palabras'],; e# c* j0 t/ s6 c8 b, v* E0 G
  255.                    "img":response.save['img'],
    1 G9 i' b: M/ D; {; Y* c- e% {
  256.                      }
    ' _9 \, Z- \* f1 [7 v6 m- }
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    6 a' j6 M1 X' J& u0 d
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) * Q' P2 W1 ^/ j$ g4 Y% h
  259.         return {
    + n- L+ @* q8 g' _
  260.             "Cater_Name":Cater_Name,& r$ {$ r: n' d) J
  261.             "Bookname":Bookname,) d% J& [) z& E2 p% H& q
  262.             "Book_author":Book_author,* |% x6 A- H+ L/ @: U' h8 F
  263.             "Book_Introduction":Book_Introduction,& F0 t7 i+ |* ?/ j4 o0 q0 _7 B9 G; P
  264.             "Book_Synopsis":Book_Synopsis,
    4 j9 U- _- m  V+ N/ Z
  265.             "Book_Palabras":Book_Palabras,, K' x1 U/ M! Q3 E2 ?( ^
  266.             "Book_img":Book_img,: k" L5 `& e4 w- G: H, Q
  267.             "Bookurl": response.url,- ~6 p# O7 @6 r/ N+ Y6 `
  268.             "Booktitle": Booktitle,
    / ]2 ~* U3 b3 N+ v( D' ~
  269.             "BookID": BookID,
    ! {# v4 O3 N/ v, u
  270.             "BookConte": BookConte,3 ^% e2 q8 R- E; c6 _
  271.             "Titleid": Titleid,$ ^+ B8 V  c6 A6 M4 I" o* H
  272.             "abover":abover,
    0 P# B7 ~9 }+ P' L: ~0 |. C
  273. #            "Book_Date" = str(datetime.datetime.now()),6 Y8 e) |$ @5 H
  274.         }: J- U8 ~7 i; h: S
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    9 M) j( b- }9 V1 [
  276.         if not os.path.exists(imgDir):
    % @( {: E6 |  g. O& k8 P2 P. T7 p
  277.             os.makedirs(imgDir)
    2 o7 U  T. \1 M# `+ \1 O
  278.         file = imgDir + "/" + file_name
    + O% X* B/ C; |$ b. e" P3 G
  279. #        print file3 b+ E7 h; n7 M, N0 X; o
  280.         f = open(file, 'wb+')) c) _( `' B. g) X. N
  281.         imag = requests.get(Book_img) $ V) H& u0 w/ c) @6 s4 l/ |4 o
  282.         f.write(imag.content)/ E1 A" v" w' [4 S6 t/ F* L
  283.         f.close()
    , ^& x  d; ]; {7 j
  284.         #保存图片前6 K0 W% i& C5 }+ K( }: x3 s( U  v
  285.     def save_imgs(self,response):6 `2 b0 H" i* y5 r
  286.         content = response.content
    0 j- |( Y& }$ s
  287.         file_name = response.save["file_name"]$ ]  g& E: q$ X6 G! w
  288.         imgDir = response.save["imgDir"]
    ( f% o; l. [2 W! p
  289.         file_path = imgDir + file_name; j& Y' a5 Q: |. X( E
  290.         self.save_img(content,imgDir,file_path)
    7 o, \( i6 w+ c0 L( m5 ~+ O
  291.     #保存图片" `( w1 O+ N+ @; Z. k9 D; T. m
  292.     def save_img(self,content,imgDir,path):+ V# ?+ Z% J8 O7 s& }' @5 c/ z
  293.         if not os.path.exists(imgDir):                         6 R5 d! c' f; H! Z
  294.             os.makedirs(imgDir)
    3 y7 x' U* _7 ^6 E% j
  295.         f = open(path,"wb" )1 I9 w% M7 W2 V& J% D0 K/ \
  296.         f.write(content)
    2 P9 ~  D" S* Z3 z4 G, Q
  297.         f.close()
    0 ^7 F, S# z3 T# u$ T
  298.     #获取url后缀名% m, s6 _' q# [2 f
  299.     def getExtension(self,url):                            ! l( ^3 O2 s) q, @$ d
  300.         extension = url.split(".")[-1]- l, ?4 P! K# ]
  301.         return extension
    5 m- x1 n) ^4 I+ a
  302.     ! W. X( W1 Y0 h; [
  303.     #获取图片名. R/ J4 K. `0 X3 g: H
  304.     def getname(self,url):
    5 p* |. t$ O- l
  305.         name=url.split("/")[-1].split(".")[0]
    6 r( ^( O4 V  U! r5 Z4 v
  306.         return name
复制代码
# {5 o2 e1 D: N5 U

/ S, ^2 E) g1 v: M& T' Q+ I
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-5 14:19

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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