找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!1 z/ [: `4 [1 w, x: N% H
  1. #!/usr/bin/env python& W1 W) i3 d' U+ s7 O  v
  2. # -*- encoding: utf-8 -*-5 F' y% Z9 a. X* w4 U2 C# _
  3. # Created on 2019-05-05 21:43:11
      O7 q$ n# M2 C7 }
  4. # Project: XiaoShuo% |3 T" n" u' j3 p5 W
  5. / U1 Y# C6 j" T: e9 V' c) J4 @, }8 H7 a
  6. from pyspider.libs.base_handler import *6 K$ l0 z( Y- ~5 I3 c6 i2 y
  7. import pymysql: X( w( [3 ], m/ i
  8. import random
    $ @9 H: A" {4 @+ r- o& q
  9. import datetime; r, x3 C% H1 O1 W
  10. import urllib2,HTMLParser,re) ^; J" C+ V5 B: C. z# ?
  11. import os
    * {+ ?9 u1 g! C" M4 J1 S' ~
  12. import sys
    0 F( X4 v. K9 ~; r5 w' h) E
  13. import re
    - o  v9 h3 R' D1 \
  14. import codecs7 }+ V( g1 ?/ S$ W; _
  15. import requests' u. ~* ]: C4 y, E/ B( G, w5 j5 ]
  16. import json
    / S; l# v! m9 {7 ?8 z

  17. * ~. A6 }; E- ?1 o+ i1 Z
  18. class Handler(BaseHandler):
    % R' @, C2 K4 I0 `- I# o& K3 y
  19.     global Datos3 D7 G( N+ u/ @6 \0 v' t
  20.     global P_dir    % |& ^* u( e- T4 }6 t- \$ z0 m
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径3 I$ U8 _. r" c7 B
  22.     global Datos
    3 r+ A4 F& V: U4 d: o
  23.     Datos = {}9 M) B+ C( v; i3 S% Q
  24.     headers= {1 g1 P+ M, c7 D+ J( A- o' }
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',6 }8 Z4 {+ P( L. g
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    * a& Q. \: M( l$ c4 `9 |* G
  27.     'Accept-Language':'zh-CN,zh;q=0.8',8 o% [' h! p1 {  K9 o
  28.     'Cache-Control':'max-age=0',8 m* G% v; }/ y
  29.     'Connection':'keep-alive',1 x) q" K- I7 z7 B
  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'( G! _. s7 a8 d3 g
  31.     }: B8 {& v  L. L
  32.     crawl_config = {6 m+ a( L6 o) {, G- \- h
  33.         'headers' : headers,: b$ ^* z- Q0 T2 X, O1 b, `
  34.         'timeout' : 300
    " A! }$ [' Y# Y6 b8 w! K
  35.     }
    " W- Q! A( V! J: G5 F! J1 L) H
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    * p% D. `+ C& m6 }$ n* O* I) }
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    * w1 ^" w) e9 @
  38.         try:# Y- v7 S& G: G# Z
  39.             cursor = db.cursor()6 W, e9 {! g( `& W+ J0 D+ k+ s2 O- @. |
  40.             #注意此处字符串的占位符要加双引号"%s"% {+ _1 ?" r) I9 c! `6 W: @
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);& T! [5 d. {8 s/ S3 ]% x7 [' E4 j
  42. #            print(sql)1 H. n, O: X* L; x1 n* G
  43.             cursor.execute(sql)3 F, Z" ?+ }" R/ Q
  44.             
    8 v/ O8 }/ |8 ?+ i( H1 N/ ^
  45.             #qid = cursor.lastrowid
    5 k+ E! B  n0 r$ q7 V! G$ y) V
  46.             #print(qid)! f4 u# x+ |; n0 t; W" b
  47.             : W: ~" V: W) M' a  _0 t1 F; m
  48.             db.commit()  G) {: J" Q" a. u6 A' r# l0 N$ w4 G
  49.         except Exception as err:
    ( Z& [9 F! [0 P; y. I) t
  50.             print("Error %s for execute sql: %s" % (err, sql))
    * i0 X+ l- D3 q$ }5 H. C% ]' y
  51.             db.rollback()  J7 \! f- {2 v: d% w
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):3 B8 |8 c3 X' H0 Z1 b- [# B7 S4 R
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")9 m0 D. u& x" r+ b6 ~$ r8 A
  54.         try:
    $ }& D3 M7 j1 l& Y% W$ r$ _2 m2 Q& N1 l
  55.             cursor = db.cursor()
    6 F# d/ Q% t. I9 }7 r
  56.             #注意此处字符串的占位符要加双引号"%s"/ g7 J) N$ v! d4 {4 f/ p5 E
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    1 w$ ?6 b0 v0 q6 z7 ~
  58. #            print(sql)/ D. |+ e5 i0 c1 k8 a& ~4 h) P" y
  59.             cursor.execute(sql)
    9 L7 _* w: C. k
  60.             
    3 l/ r  C/ |! \! A6 A
  61.             #qid = cursor.lastrowid
    - [0 _4 ~7 F* v$ E4 T1 I
  62.             #print(qid)/ s! D% X2 ]- a5 e" O, a8 o( Y1 G. h
  63.             5 I( ]" T" h6 Z8 N( ~/ O# @/ D
  64.             db.commit()
    8 l/ B( J" J7 }8 m* @
  65.         except Exception as err:
    8 h, ~+ t2 G3 H$ _. P* L
  66.             print("Error %s for execute sql: %s" % (err, sql))
    ! G' ^2 q# ]3 @
  67.             db.rollback()
    * n- K4 ~$ p+ a
  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 S4 r2 A2 d3 e$ o# X
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    - Y, R; s6 o. Q  v6 w( ?
  70.         try:1 m# Y& Z* y5 e5 f" U
  71.             cursor = db.cursor(). {5 |4 b7 z5 M/ {8 r
  72.             #注意此处字符串的占位符要加双引号"%s"- C; Q0 Z% M$ q5 [; B2 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);
    " G) A9 \: F5 j% h9 c. j/ Q
  74.             print(sql)
    + ?7 A6 E; l# X9 L$ x* T" F: W8 D
  75.             cursor.execute(sql)
    ) s5 r1 E1 j8 U; V
  76.             print(cursor.lastrowid)
    ' x" H! N2 S! i% C- A3 c5 P- Y
  77.             db.commit()
    ! G  K3 T5 ?! Z
  78.         except Exception as err:, [+ s: n$ Z( K" g  ]
  79. #        except:
    % F- j2 ~% k4 x1 u2 [/ ^6 I) p
  80. #            print('Failed')8 Y2 ^0 E, }4 C" M* i7 |, p
  81.             print("Error %s for execute sql: %s" % (err, sql))5 n) Q$ b: X) A4 O, K4 J
  82.             db.rollback()  U5 y1 j, {! v% o- E' Q# l) h
  83.         * J# u9 @, w- j' u
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    5 G4 x7 z4 G2 V
  85.             reload(sys): @2 |: q# K0 ~6 W  z! T) f' [
  86.             sys.setdefaultencoding("gbk")2 P3 h7 P+ G- C4 o  \- B
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    # }: N" c$ {- D5 o, D0 P& K. g: Q
  88.             locoy_data = {3 y- J7 {" P; A: `5 w4 [
  89.             'my_u':'用户名',   #后台用户名" `, o) D, ~' K3 Q, b7 y+ U- c
  90.             'my_p':'密码',   #后台密码8 k2 k8 W, u- e7 {2 I$ o
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),2 \: c0 r8 b6 c2 B: o0 Q. E
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),( x' v* C1 Z/ y7 R4 Z
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    1 F( x0 V9 ]) U+ w  w
  94.             'article':BookConte.encode('gbk', 'ignore'),5 {1 u$ c" f( F4 \% m
  95.             'author':Book_author.encode('gbk', 'ignore'),
    3 |" O1 J+ [( J( g& P$ o0 n/ L
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),( D0 g# E( g+ s: T! |' _; |
  97.             'thumb':Book_img,. G: F. t+ Y& o- T* m! O
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    4 d! G0 w: X0 z  N# ]
  99.             'abover':abover.encode('gbk', 'ignore')           $ F: j9 t2 s1 j" K7 n+ U! J3 b9 B
  100.                 }
    * J* h0 q' E. \. r$ ^  A1 B
  101.             res = requests.post(locoy_url, data=locoy_data). w/ x2 d. Z) q- R% b* D1 T  A
  102.             print res.text4 }, q' h/ Q$ z4 \! x" J+ Y
  103.             print res.content9 Z/ w2 M& r9 A4 J
  104. #            print Dsd; l1 D: Z- V; b; ~3 z) r  d" n
  105.             return res
    9 Y/ u- k  K7 g/ n* C- U+ o
  106.    
    ; Q% x% P& o! C" M7 W
  107.     def __init__(self):1 y: k/ q9 N) I6 _- I, K
  108.         self.base_url1 = 'https://www.****.cc/'* O: O- R+ k& S: @% j8 j( c
  109.         self.base_url2 = '/'
    9 w5 ?, C( w7 L$ T0 Y! J3 d8 P
  110.         self.CaterId = []
    4 n5 q% f# r0 \3 m% h: o: K- G( }
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']! L& _8 C. h$ P/ s
  112.         self.page_num = 14 }* X: D4 e! S2 w
  113.         self.total_num = 200   & u% a! j) q/ M, q

  114. . W2 ]$ [5 z7 W2 B: ^
  115.     @every(minutes=8 * 60)9 ]6 b5 x8 e. c
  116.     def on_start(self):
    / B2 n1 ~" h0 k6 T7 j
  117.         global Cater_Name
    ' B+ w  }# [8 M* H+ z
  118.         Cater_Name = []+ f- p, c- i% L+ m; c6 j7 D) e+ F. a; w
  119.         while self.page_num <= self.total_num:
    * u9 X. C% K' |* S* o. O( p/ @+ z0 v6 d
  120.             for self.CaterId in self.CaterIds:; K5 b# L% V2 t' ]* K* b
  121.                 if self.CaterId  == 'xuanhuan':
    ; N4 b4 \- p3 E+ w9 Q
  122.                      Cater_Name = '玄幻') L# x! Y& n+ ^! Y
  123.                 if self.CaterId  == 'wuxia':
    6 U* Z: [0 k; S) i6 ?! e; j
  124.                     Cater_Name = '武侠'; a8 z, L, ^4 }5 \3 \8 u# g
  125.                 if self.CaterId  == 'lishi':
    ' x9 H) }2 }% z! ?) \/ s
  126.                     Cater_Name = '历史'            & [+ c0 H: d' L: Z  u1 y
  127.                 if self.CaterId  == 'yanqing':
    % C% f$ X9 }' C
  128.                     Cater_Name = '都市'
    . a, @' k8 ~: G" x
  129.                 if self.CaterId  == 'nvsheng':
    - F8 K1 Z6 d% R8 R  v
  130.                     Cater_Name = '都市' # [0 b4 h/ E* o$ h6 |) p/ J, l
  131.                 if self.CaterId  == 'kehuan':" L5 O, d. s) g( }5 f& p* ~
  132.                     Cater_Name = '科幻' 8 b$ N" v) `- x  s/ p  o8 Y
  133.                 if self.CaterId  == 'kongbu':
    8 C( r8 S1 Z% D3 y, l
  134.                     Cater_Name = '游戏' ) Y( M6 r  z! W6 T9 c- ?; l, i4 g
  135.                 print self.CaterId
    1 l: r; m; d8 x" I& e
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          ' \2 O2 M# C2 `( w
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)) S" M' C8 r0 Q" h% `3 L) Y6 r
  138.             self.page_num += 1 + J2 x% o( u- Q: ?) Y
  139.             1 @  Z* v( D8 g7 k
  140.     def list_Caterg(self, response):
    3 Y% @9 V$ H* r3 a9 |
  141.         Cater_Name = response.save/ r1 e1 ?1 V( {
  142.         for each in response.doc('.pic-list a[href^="http"]').items():7 L/ M; x4 U$ E( p
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)5 g+ x: b, D0 ^7 x! L7 t: V& `; q
  144.             : P8 X1 o/ n3 _. t8 D, X
  145.     def list_Caterg_detail(self, response):. a8 E- {& V( J( ]) ]/ U( p
  146.         Cater_Name = response.save
    : P& a7 R( q" U5 P; A' o8 ^
  147. #        print Cater_Name' m% i- C5 m/ i% D. C1 ^$ O* `
  148.         Bookname = response.doc('h1').text()
    % S5 ^( J0 F& X$ J, i" k3 |
  149.         print Bookname4 T/ U) a& X+ x4 ]* V: }
  150.         Book_author = response.doc('.authorname > a').text()  S! ?9 r" v) o
  151. #        print Book_author3 a9 k/ _! D5 A' N1 `
  152.         Book_Introduction = response.doc('.book-intro > div').text(), r$ U- y* p1 L7 u! ]0 U
  153. #        print Book_Introduction
    ; ^' m% p$ A8 y  V
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    * x3 r1 S5 d% F% @7 F, A
  155. #        print Book_Synopsis2 v( J2 t( }+ S. R: |3 w( \
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]5 ]& s/ \; Q* c* A
  157. #        print Book_Palabras
    % w( H! ^6 h+ N( l4 k, ]- [* b- z, P
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    2 m6 ~. W- m3 G6 v* L* Z; ?3 l
  159. #        print BookIDs
    + w. g8 _% N& o7 G# D
  160.         Book_Dates = str(datetime.datetime.now())         
    * z7 y- z1 L- Z' A3 w9 |4 E
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():' u' `- z( Y, W& d# [  v6 a
  162.             img = imgs.attr.src
    9 b6 O4 q: q$ U
  163.             print img
    3 G  L; F' J' a' }3 l- ^! T+ |
  164.                 #小说封面下载
    0 L) Z+ @3 J5 O4 p  O7 J. ?; q* W
  165.             extension = self.getExtension(img)
    & v! o) A+ X5 K# r  T# E( C
  166.             name = self.getname(img)
    ! F0 x9 T* ~1 m8 }) n' J1 F
  167.             file_name = name + "." + extension# F' D. _6 p- L, B7 y4 g1 y+ ^. K" e
  168.             imgDir = P_dir + name: N8 V+ ?# W! O3 a) t, K( H, _9 P
  169.             Locaimg = imgDir + "/" + file_name% @" j9 C  y# c& a- o$ f  l' d+ [
  170.             print Locaimg- }  Y' q2 P1 S! H$ X! G
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地8 K$ A5 l9 B; w2 \
  172.                 print('attachment url is ' + img)               #; _, F( c) w8 T- |. p& |/ U1 ~" L
  173.             Datos = {. q; p( v; m7 h1 R8 e6 D
  174.                     "Cater_Name":Cater_Name,
    $ d' w; D$ ?( u
  175.                     "Book_author":Book_author,2 T/ g" I9 h. X8 G
  176.                     "Book_Introduction":Book_Introduction,
    ( ?9 E: e( f3 O; D+ S
  177.                     "Book_Synopsis":Book_Synopsis,
    / m) A: }& w- e/ \
  178.                     "Book_Palabras":Book_Palabras,( u9 }  C. `7 n% q6 f
  179.                     "img":img,4 x$ b! u0 N9 d& h( Z
  180.                 }
    : t; t" t2 ]: e
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    ; h! G8 d: F/ d3 s1 u  R6 |( A
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    2 u8 U5 R1 c) K# B; Z: q  N
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)' p0 p( V3 E0 |5 o# T6 U
  184.             + k. v9 A  e& M5 z
  185.     @config(age=8 * 60 * 60)      F) I! t( r8 c) W
  186.     def index_page(self, response): 9 L# [& H, J# |% j0 O
  187.         Datos = {
    ) ]1 i0 D( g2 _$ [
  188.                   "Cater_Name":response.save['Cater_Name'],
    6 `+ D3 x  Z, \# r
  189.                    "Book_author":response.save['Book_author'],
    ! S3 k3 M3 N/ R
  190.                    "Book_Introduction":response.save['Book_Introduction'],# |: @  o1 J) G" b( r6 ?
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    + m" m0 k+ K& e6 b' V3 G
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    ! d  u3 j1 G7 V/ j; ^1 d8 l
  193.                    "img":response.save['img'],  q. J4 \5 L* ~: a% I8 \5 h
  194.                      }
    0 P; X& t8 w( V8 t' ^
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():5 S6 |2 M0 c* X4 Y8 A  a
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  0 e' g6 j- R4 l# l9 g: b
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)5 Q. ]1 j/ F( [; {9 g
  198.     @config(priority=2)9 a6 E6 x2 {+ q5 o" m
  199.     @catch_status_code_error- t* P" k) g, o8 O, z* J7 O8 {) z. ]
  200.     def detail_page(self, response):        
    / y% f- h% q# @' c* X( M
  201.         NewRe1 = u'哈书'5 y! d0 I6 L' E. t5 f1 {$ W( M
  202.         NewRe2 = u'huhjsd.CC'
    + y6 U( Q" x  M
  203.         NewRe3 = r'^\\n\\n'
    ) \5 _, G7 |9 J$ m3 {; i, a8 o
  204.         NewRe5 = u'小说网'3 @: Y1 g) J" H% J
  205.         NewRe6 = u'fgdfgf'$ W' u3 t5 w4 g* h# S2 h" }
  206.         NewRe7 = u'fgfgf'
    ' r$ T" D7 b9 j  m; O
  207.         NewRe8 = u'ffhgf'
    , k& _  o* u( X9 W4 i& r* F
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    ! j1 W9 i4 O$ y- X5 i
  209.         ReC1 = u'静思'- r! g* B  @% |1 _- C* q4 e
  210.         ReC2 = u'aghgf.com': e, t1 j( x5 O5 x8 F" Z# x8 Q- D" K1 Y
  211.         ReC3 = u'aghgfh.com'" E# F- v7 o$ Q+ }
  212.         ReC4 = u''8 a! W3 c; g; ]- t3 l, ?( E1 ?& x
  213.         ReC5 = u'文学网'
    / j! L0 `4 A3 y- j. ^
  214.         ReC6 = r'<BR>'
    5 D  V+ ]  ]. x$ @. a* @: j! q
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称- z% X5 z4 M. }+ d! t& v3 o1 M
  216.         print Bookname$ n4 V. a- s: I' e
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    * z% \0 t0 ^: i2 ~5 ^
  218.         Book_author = response.save['Book_author']   #小说作者* M, {0 F; g) Q* b
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介3 u8 V  o  W$ Q, }) n. K
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新' B3 G4 u  r+ @; h3 o* J" ^
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数/ Z. f0 I& `+ @$ t; b# j
  222.         Bookurl = response.url   #小说网址
    . d& H  C* m4 K& |1 |) Q. [! S7 l
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    ) a6 b) V% n  B4 j, T3 Q  }
  224.         BookID = response.doc('.readset-r span').text()   #小说ID+ Z, `8 M. J, v5 o% Y# G3 W
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    4 ]0 w4 O6 W: j0 A2 {
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)' Y  L- m3 U0 s, C2 k
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    6 u: Z$ d, q& E0 G- @( K& Q, B
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    ' w" _+ [8 X0 D7 \0 n
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    5 E* G; N% P4 S0 c$ d8 C
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    . O- n2 E5 @- B4 I; v' J% w6 w1 ?9 z/ f
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)6 }* y# I! R& B. C
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)/ X0 }# ^. w4 R4 v
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)8 i) R9 G2 }) r: b, Q3 {. Q& \9 |
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)) ?8 t1 f0 T& Q8 Q' X( D' V8 t0 W( C
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    1 l' x; x& A* J! @9 ?2 Z) m
  236.         print BookConte
    ( J, R* ~4 m$ S6 e* @9 H3 e7 }
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)' N* N" U/ Q, e* C9 V2 R  J
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)# u; [1 ]; z' I' d, H
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)3 |$ I' g; k: \  z; B
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)$ R: \5 m* x: A% p7 n
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    + u& y: b$ ]' ?' x; w
  242.         Book_img = response.save['img'],  #小说图片- ~2 c8 V0 m% E! r  }. \4 u
  243.              ( a6 }: G' ~# t( V
  244.         #insert into MySQL 小说入库
    , F" n6 b$ i2 }  j: _# B2 {
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    5 Y$ U: W+ v* s
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    : _7 `1 }5 P! ]% n2 W: X# m& |
  247.         #post提交发布' Q: @9 D0 w2 M) t
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    ; Q  K( w! f' F+ N! {
  249.         Datos = {
    & D% `1 p, {5 {% O9 V
  250.                   "Cater_Name":response.save['Cater_Name'],( X+ ^7 t& c3 d  e+ N4 q6 x! A
  251.                    "Book_author":response.save['Book_author'],# O$ _! X0 D# K& F4 x% z
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    , ^! Y2 T. d4 D  K" n6 J
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],- o* a# J, q8 [9 `6 a
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    1 h5 i/ M+ a7 A# s, s
  255.                    "img":response.save['img'],$ S) h% w9 j: H7 }6 `& p
  256.                      }
    6 W# u5 [" b. S7 f
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    : c9 D$ o2 v# e6 _+ O5 d
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) 9 f2 }9 g3 @* {: n
  259.         return {* h! R* n$ S; \0 Z, o& M  Y/ p" ^
  260.             "Cater_Name":Cater_Name,1 K3 h6 E: k( g2 L/ _; f
  261.             "Bookname":Bookname,' L* j5 z; n' z: q( I4 U
  262.             "Book_author":Book_author,
    0 q4 z$ p# n9 @+ _2 ?2 N, j
  263.             "Book_Introduction":Book_Introduction,- p. j: R. U7 R/ W% f- Z$ t
  264.             "Book_Synopsis":Book_Synopsis,
    : U$ }5 m7 {! W6 Q4 o5 l9 I/ J! e( }
  265.             "Book_Palabras":Book_Palabras,7 m$ }6 C( k2 y
  266.             "Book_img":Book_img,' @6 w  u% V4 _' x
  267.             "Bookurl": response.url,
    # J5 [3 P  q9 Y% H8 H
  268.             "Booktitle": Booktitle,1 v4 H8 n0 z/ }# B- s
  269.             "BookID": BookID,
    8 }; b6 @4 O1 A
  270.             "BookConte": BookConte,5 k: S2 w, V! y8 `
  271.             "Titleid": Titleid,
    3 V8 T0 \. A1 }7 f
  272.             "abover":abover,
    & Y" d7 {) v- d+ c0 O
  273. #            "Book_Date" = str(datetime.datetime.now()),
    / z: U  h2 O( |' m& `6 D  J
  274.         }8 ]" _& E6 y* L8 F( i& ]
  275.     def download(self, P_dir, imgDir, file_name, Book_img):3 w  W" x/ |8 t- N& e" Y
  276.         if not os.path.exists(imgDir):
    , }# R0 v+ e( G/ [
  277.             os.makedirs(imgDir)
    / f( N4 t2 q0 o, `0 X  e
  278.         file = imgDir + "/" + file_name
    ) y7 Q* P, e& b2 T9 w
  279. #        print file0 u: d5 Q5 I; D. \
  280.         f = open(file, 'wb+')0 E& o$ y7 ]6 w+ B" z, f( r- p
  281.         imag = requests.get(Book_img)
    7 J9 C: U# E8 ~2 P
  282.         f.write(imag.content)5 c5 o) c# ~& k, V1 {2 i0 T& ?$ l( w
  283.         f.close()9 |0 t6 H" I( l
  284.         #保存图片前4 o* @+ i. ^0 A
  285.     def save_imgs(self,response):
    , X6 O4 E  V. k7 e; h& p. k$ a
  286.         content = response.content( H" P. P# J8 S" [1 v1 @
  287.         file_name = response.save["file_name"]+ I0 A. w% A$ }( E- L( O7 V
  288.         imgDir = response.save["imgDir"], H* T4 {+ R" A) y9 U0 e2 ^
  289.         file_path = imgDir + file_name8 L0 [, P8 ]# X" I- K/ ^
  290.         self.save_img(content,imgDir,file_path)' q1 s9 _- z6 L  r: l: \/ l) k6 Z
  291.     #保存图片' |# }* E$ M- `5 ?; L/ j! \$ K0 u: ^
  292.     def save_img(self,content,imgDir,path):
    ; D1 u  |% ~' P9 {5 c
  293.         if not os.path.exists(imgDir):                         $ b# I' U9 [6 y5 v! ^8 M
  294.             os.makedirs(imgDir)9 w( J' K) t, ^6 w2 r' T8 R3 z* s
  295.         f = open(path,"wb" )
    % s( j, S# y1 Z" D( x. O
  296.         f.write(content)
    ( @; c; F$ V/ [* a
  297.         f.close()
    " ?8 K8 E; E. }  B! m# Z
  298.     #获取url后缀名
    * z0 Y3 O4 w/ k2 H7 e% V. B% U$ q
  299.     def getExtension(self,url):                           
    . H$ F. q+ w& V( w! w) A
  300.         extension = url.split(".")[-1]( T# H5 y! Z6 n7 V- b( t
  301.         return extension * D: I/ N7 O, e0 L6 c- s* U9 ^
  302.     # Z# k& f0 I1 C1 A0 g- G2 Z
  303.     #获取图片名
    # b, \$ I7 Q1 I$ N$ @/ U3 M
  304.     def getname(self,url):
    . a/ ~2 X# m: `3 `  T
  305.         name=url.split("/")[-1].split(".")[0]
    + z9 H& D! M0 j, [
  306.         return name
复制代码

. H1 S5 Z; O! X$ `- e" \. f
% s2 [* Y6 G% P* {$ N' J( u+ P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-24 07:58

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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