找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!/ t5 K( u0 B! _% w+ S
  1. #!/usr/bin/env python
    $ X" D7 t) V1 _; \' `# H( F
  2. # -*- encoding: utf-8 -*-5 y" a8 \9 E% X% H2 A
  3. # Created on 2019-05-05 21:43:115 Y# M" [4 R" H5 a5 L# d$ P( d
  4. # Project: XiaoShuo
    % x' I; A$ |0 ~

  5. 6 b% ?0 x* Z) l" l8 U1 q+ L) [9 v
  6. from pyspider.libs.base_handler import *
    ! M0 v9 ~$ ?( ^8 m, l- P; T" G. l) r
  7. import pymysql! H& M' S6 ^1 h, E, h" G+ z
  8. import random& g/ F: d) p0 c: v/ r
  9. import datetime" F. x) O7 m. Y8 k7 e  I
  10. import urllib2,HTMLParser,re2 n, p3 B% H. ?6 F! U
  11. import os
    ) i, X& K, p$ y$ |
  12. import sys; }+ D5 w- q: z9 d" o* a4 ?
  13. import re+ ~; U! ^4 E, w( u( K; g) T, s
  14. import codecs
    % R; g, \( @4 m) q# V$ g7 X. u
  15. import requests
    - n0 e0 S8 F/ L( q
  16. import json7 f6 _: Z; g8 T$ R! g

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

本版积分规则

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

GMT+8, 2026-11-6 07:38

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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