找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
7 d: Z2 G2 a6 X# |
  1. #!/usr/bin/env python
    ) n3 j6 p6 d% G6 W' q4 G, j' J. i. J2 s
  2. # -*- encoding: utf-8 -*-
    ( O! |/ G5 L! L" E) q. u7 H
  3. # Created on 2019-05-05 21:43:11
    + @: O- [+ T9 z- Y
  4. # Project: XiaoShuo) P9 i7 d& j- D8 U  d5 h4 @' v6 _

  5. 7 M. a: V$ G! x8 N' \2 O/ `
  6. from pyspider.libs.base_handler import *
    / ]& l8 a* u" ^. D% z
  7. import pymysql7 Q5 ]9 E" V$ M8 v; o
  8. import random4 L$ _, S" x0 \& z7 L. a; d
  9. import datetime% r! a; d* z: ~3 A
  10. import urllib2,HTMLParser,re
    . M' u/ I; O' `: K/ |+ d
  11. import os  a8 G5 F9 f, o/ }! x5 x4 _6 E
  12. import sys
    # y/ q5 I4 o4 C3 c1 @1 V; ^, ?
  13. import re3 P6 @1 |8 G) m- D) W
  14. import codecs
    . q* M* Q2 t- f+ F3 b  C
  15. import requests
    " A) M) R1 v1 m5 X" D
  16. import json
    0 D0 `2 T" Y9 S1 \% h
  17. ! T- P; s! s! }
  18. class Handler(BaseHandler):5 o, W  _0 `( p- S" E
  19.     global Datos
    / ?8 j, H8 P" X' z1 v$ N
  20.     global P_dir    0 ^+ d1 [3 b& v: J! j" Y7 A7 I
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径: r. Y6 P. R# Z& }$ H( f* l
  22.     global Datos
    - j  \( x; }3 r) u
  23.     Datos = {}0 F5 s5 w7 `1 T4 K  A6 C
  24.     headers= {4 U3 q0 Y$ G9 ]% s% g) u* u! a
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    % A/ p  y$ E% T' A3 Q7 f
  26.     'Accept-Encoding':'gzip, deflate, sdch',( N* H8 h8 Q% F' _9 o
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    # n  a3 y' l1 T+ ?" X% _7 n
  28.     'Cache-Control':'max-age=0',$ U' k5 ~) s( z6 v  U* n7 i  Y
  29.     'Connection':'keep-alive',% c4 ~- o9 @5 \" U
  30.     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'! x! Z- A" m% L2 t' g& _( J4 G
  31.     }
    ' b- c* |7 V9 v+ t% q! i. \
  32.     crawl_config = {
    % M( K+ f" R# f7 O
  33.         'headers' : headers,
    2 C' }  @+ e+ W8 ]  R+ v8 n
  34.         'timeout' : 300- B" ]+ u4 W5 N6 V" a; ^9 D
  35.     }
    ; R: ]& W7 G9 y( P
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    5 [  j- X' m. `+ [
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    : e. W1 f+ @; y7 F
  38.         try:" c/ _7 Z7 y. |/ G  e/ k
  39.             cursor = db.cursor()
    . L( a  G4 n; D* ^% {" l
  40.             #注意此处字符串的占位符要加双引号"%s"
    5 m' Y' f, V" s, ^5 y& N
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    2 C3 U( v- b* d# B
  42. #            print(sql)8 S6 }; Q7 S7 H# E2 l$ B
  43.             cursor.execute(sql)8 g; D# ~: Z6 E" t4 e1 g- e
  44.             
    2 s: N& m9 z4 @- ^, _: x! f+ [
  45.             #qid = cursor.lastrowid! ]) Q# V$ B: W0 ?) T1 [
  46.             #print(qid)
    4 W  X+ G* K, \
  47.             , W5 H2 F* G$ D5 ?( W
  48.             db.commit(), k0 P" M9 Q  W% [
  49.         except Exception as err:
    & d. e, h% d) @2 z8 E2 f5 y
  50.             print("Error %s for execute sql: %s" % (err, sql))' |% {% D: b# z  u
  51.             db.rollback()/ O$ }5 A+ O0 ?% n
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):2 b, o. @, H, y. t' ?/ A# `, G
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")3 k8 H# t' \& u8 m
  54.         try:
    7 |" y5 J5 U7 [4 K
  55.             cursor = db.cursor()
    , x' ?* ]6 X; O! n; U7 R
  56.             #注意此处字符串的占位符要加双引号"%s"
    % S9 `- e# ?* `2 G. F
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    2 e- u3 p  U$ q! L
  58. #            print(sql)
    * a/ e( j8 g% a0 e9 @0 d
  59.             cursor.execute(sql)! l7 E. p' D& C, n/ ]7 h+ m* p
  60.             
    7 q8 R9 N& R0 @8 H# s/ M
  61.             #qid = cursor.lastrowid" }1 m; i1 N. ]6 [) ]
  62.             #print(qid)
    . ~% R( L" a. x* `: U) t
  63.             
    8 H& q/ W7 ~6 N! c" f! r
  64.             db.commit()) l3 Q* b0 ]) D) M# w# Z4 M% `
  65.         except Exception as err:
    ; R* z! K. ^6 [& R
  66.             print("Error %s for execute sql: %s" % (err, sql))
    5 u% y( L' d+ Y
  67.             db.rollback()
    1 H* B* j" _) B! t8 D% L) j% k
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):! @. j5 L# w( q. _# T9 S" L
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    2 s/ b; ?4 f+ [: U9 R' e0 g- G  y
  70.         try:
    , ?. X# t" E2 R: M: ]; P! R7 h
  71.             cursor = db.cursor()" R2 D* L1 ]3 C3 A; W
  72.             #注意此处字符串的占位符要加双引号"%s"
    " z! w1 h2 Z# E' c2 j
  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 W7 ~. R9 |) ^- u* q  ^
  74.             print(sql)
    6 w5 b' j) [; T8 s% p* _6 t& Y
  75.             cursor.execute(sql)
    9 z5 @+ U% h2 {) `
  76.             print(cursor.lastrowid)
    ( X5 V7 a- H- c7 M8 k4 A1 W
  77.             db.commit()
    * c1 x  l* n& |$ B- I& E0 L
  78.         except Exception as err:
    % O- P# `! C$ ~$ a( v3 b
  79. #        except:
    ! o3 G* u5 o$ t' }1 Z
  80. #            print('Failed')
    ( J! ?/ u( h4 H/ Q: C" B! t, B& Z
  81.             print("Error %s for execute sql: %s" % (err, sql))
    4 E6 t/ {9 C* ^9 z* k
  82.             db.rollback()
    " j9 W% Q4 i  x' L4 o2 D
  83.         / ]0 @! Q  o& l+ t
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    2 a/ m1 j4 i' j- d5 u
  85.             reload(sys): {  t( o# k/ D' w5 y! o
  86.             sys.setdefaultencoding("gbk")1 ]' \: r" Z6 k4 T. S+ v$ S  `
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    " T* x: s. y5 b" v# G. ^
  88.             locoy_data = {
    ) ?( a/ Z0 Q* u! y5 h3 M( c
  89.             'my_u':'用户名',   #后台用户名7 A! _! j) k3 w9 x/ {- F/ |1 P
  90.             'my_p':'密码',   #后台密码) b0 {' {; ~% _: _! A3 G
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    7 |8 `$ g  R0 M6 M6 Z9 p* c
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    " y: O! E( S$ `/ h" V+ I5 `: E" b
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    * a$ f1 u; P, Z# L% k/ N
  94.             'article':BookConte.encode('gbk', 'ignore'),+ y1 o& `- Q' ^1 x- a6 w
  95.             'author':Book_author.encode('gbk', 'ignore'),+ C$ F. {3 m" B* t; h! e
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),1 g+ h- C4 d$ o6 d% w* `6 j
  97.             'thumb':Book_img,
    7 S4 c1 Q2 ?0 A% P2 I* |
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),& ]5 y; m4 x& [
  99.             'abover':abover.encode('gbk', 'ignore')           . b& y8 j$ ~. F1 w1 `/ g% l6 d
  100.                 }! r6 I% K) w/ A& E2 ~, Z7 D
  101.             res = requests.post(locoy_url, data=locoy_data)
    / E+ h) s8 W% p
  102.             print res.text3 |8 X. V" w5 ]4 d% {/ K2 f
  103.             print res.content, W! V) M( r: {
  104. #            print Dsd
    3 X' b1 o, s& l' L7 P: Y% C
  105.             return res
    ) Z& x% n+ q( U+ o: O; q& W
  106.     * x9 I2 i+ W* Y& M# }& `; E% I+ T
  107.     def __init__(self):, e+ S3 k* q* Q$ `% x3 |( |
  108.         self.base_url1 = 'https://www.****.cc/'
    , N2 L# T: {% R& H5 p# \& G
  109.         self.base_url2 = '/'
    # O# Q, I+ y0 b% K# F( T+ ?
  110.         self.CaterId = []
    5 @/ f$ N& \. Q. p% S5 C
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']3 N+ z4 y& B5 |" X$ d. s  k
  112.         self.page_num = 1' v2 T; N  r) u; x! H, n8 I
  113.         self.total_num = 200   8 I1 _" Y8 o& Y2 i! X

  114. 6 R, l% Q1 h4 e3 l9 T4 S: O% r
  115.     @every(minutes=8 * 60)
    3 Y/ f: @& j' l1 z
  116.     def on_start(self):
    & }; D( O, \0 \, R; I/ a; u: D6 O
  117.         global Cater_Name
      O4 h5 Y8 k9 `
  118.         Cater_Name = []0 \  k9 l  X) h8 a- y' @
  119.         while self.page_num <= self.total_num:
    # D/ |4 }: J+ E& J: m
  120.             for self.CaterId in self.CaterIds:1 S( U& \8 i9 ?  y+ ?. t' _, p4 I
  121.                 if self.CaterId  == 'xuanhuan':
    . n- R6 d" m- S- L
  122.                      Cater_Name = '玄幻'( ^/ V! o  ]6 v5 S
  123.                 if self.CaterId  == 'wuxia':
    8 r) V: N# S: }7 z3 f% n
  124.                     Cater_Name = '武侠'
    6 r: p4 }9 t' J. O
  125.                 if self.CaterId  == 'lishi':* X3 A2 o& C% |/ @8 a: e1 y, ?
  126.                     Cater_Name = '历史'            
    ) ^! C& a; X* K+ {* n8 a6 n$ `- w
  127.                 if self.CaterId  == 'yanqing':
    - Q& A2 J( A2 Y. [/ P, w1 ?) K
  128.                     Cater_Name = '都市' 6 ~' F# |9 E8 S& |
  129.                 if self.CaterId  == 'nvsheng':9 w9 Y! o" k% G0 H6 ?' m  }
  130.                     Cater_Name = '都市' ) E% W2 z5 i6 I$ f3 ?7 d
  131.                 if self.CaterId  == 'kehuan':
      p: P5 l6 U) U/ B
  132.                     Cater_Name = '科幻'
    : d  x/ D' I1 a  `
  133.                 if self.CaterId  == 'kongbu':3 L0 n- s5 ?# ~  }1 [
  134.                     Cater_Name = '游戏'
    6 f' E) J& W1 [' Z$ u
  135.                 print self.CaterId
    ) E* Y  h* ]! G( }7 g
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          1 `" r& o5 V, f, Z( a
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    5 `- A% M! F9 K; E. e0 j
  138.             self.page_num += 1
    2 @, L8 n+ ]( _* D1 L8 Y8 W! I5 E
  139.             - J# \, Y3 Y# k/ [! S9 E6 B
  140.     def list_Caterg(self, response):
    " S; n& s( I- w( o
  141.         Cater_Name = response.save
    2 n& ]4 |: F" Z/ e2 z* N2 ?; `+ u/ |
  142.         for each in response.doc('.pic-list a[href^="http"]').items():' v* J$ O0 n: u8 d
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)/ E9 j/ f" B9 Q. o7 p4 F5 ]& w
  144.             
    1 w' \6 k# h& A5 P# q
  145.     def list_Caterg_detail(self, response):
    7 _" A' J* ?1 @7 L+ Q
  146.         Cater_Name = response.save
    * ?" |4 o+ l; w6 C. G1 R9 H
  147. #        print Cater_Name. `3 |, N( {2 d
  148.         Bookname = response.doc('h1').text()3 b" U% P0 W6 a- C. I
  149.         print Bookname
    ' u- B/ c' L6 L* j$ r
  150.         Book_author = response.doc('.authorname > a').text(). M+ V& r* t0 D9 r5 X7 W5 ^
  151. #        print Book_author
    1 p3 ~" M# e! Y3 e
  152.         Book_Introduction = response.doc('.book-intro > div').text()  W4 C+ s; l4 c* Q/ C* I% T  }2 w
  153. #        print Book_Introduction# i; x( {- j: O/ A9 J
  154.         Book_Synopsis = response.doc('b').eq(1).text()! c5 @1 ~6 i4 f) U% f( X$ x  Z
  155. #        print Book_Synopsis; d3 N4 k, D( P& k2 Q
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    " T# F" v: G$ y* y
  157. #        print Book_Palabras
    " q7 w$ n; V, Y0 v
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    ' r0 g" C; H+ i( Z
  159. #        print BookIDs
    * m& U) m& z" A
  160.         Book_Dates = str(datetime.datetime.now())         5 f( S2 j* y5 r
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    6 c* U: y0 E0 f
  162.             img = imgs.attr.src
    : P$ N- q8 u' V0 z$ ?, z( Y* M" o
  163.             print img6 `+ M2 o$ y( r6 y: r
  164.                 #小说封面下载/ U0 K1 s& [: d
  165.             extension = self.getExtension(img)
    - }' S1 l' D0 h7 G9 h
  166.             name = self.getname(img)$ X8 i! V+ K. y4 X0 k
  167.             file_name = name + "." + extension$ G; ^- _: J8 e  W
  168.             imgDir = P_dir + name
    9 [# C+ O& y& D* s* l: F' Q
  169.             Locaimg = imgDir + "/" + file_name
    ! _) U7 k( x3 ^% c: O* |/ X
  170.             print Locaimg, m( D! [- W$ V" o8 u+ H% _
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    $ m3 o8 v( G; L" M6 Y" Z! u  y* _
  172.                 print('attachment url is ' + img)               #: j) O; ^; t: b
  173.             Datos = {/ r( a/ U) g  s$ |+ L  B( J
  174.                     "Cater_Name":Cater_Name,
    " |& @; B' D5 y
  175.                     "Book_author":Book_author,+ }' D& ~0 l2 U$ u) e
  176.                     "Book_Introduction":Book_Introduction,
    & E; q% f% D- A4 F7 `
  177.                     "Book_Synopsis":Book_Synopsis,
    5 g' l) D# n9 F. |  Z( J# K
  178.                     "Book_Palabras":Book_Palabras,1 i; m" K- |( N" ]0 |4 |$ y# Z3 }
  179.                     "img":img,
    1 T* ]( w2 G1 f
  180.                 }
    " k4 T0 x: `3 O/ y! @1 b% i
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布. r5 V2 O( V3 V; Y
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    % X% V" x) a* ^
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)4 K: Q7 t( ?" l
  184.             / \5 @  G. p  b) f- ?7 V+ D; a
  185.     @config(age=8 * 60 * 60)    3 c; I9 V9 s# H5 [- ^
  186.     def index_page(self, response): ; v, [3 o5 O+ D' [" F6 _/ q
  187.         Datos = {9 S7 ?6 G1 Y7 A! ]: ]
  188.                   "Cater_Name":response.save['Cater_Name'],  I3 x9 B2 M0 t3 S
  189.                    "Book_author":response.save['Book_author'],
    8 R$ v/ \' @0 g; E
  190.                    "Book_Introduction":response.save['Book_Introduction'],3 J: [4 y- ^$ d
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],, u& ~1 h3 O9 H6 v& o4 l
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    % M" E4 l% ?- T0 Z0 [5 n- }
  193.                    "img":response.save['img'],$ h1 M4 c% c  ^# n7 w
  194.                      }
    . ]& D$ `2 Z2 m6 R$ D5 i/ V  }
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
      u$ L; t/ Q- b1 m0 o# W2 Y, _
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  . `$ f) N3 p9 s2 d
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)) [8 ^9 I8 J! F3 R- W0 [( i5 g: u: A7 u
  198.     @config(priority=2)7 l2 H8 f6 T, v& c- S
  199.     @catch_status_code_error
    3 e) p) O( C' p' V9 z
  200.     def detail_page(self, response):        
    7 {; C3 X- }3 R9 V# f% x5 H' c9 A
  201.         NewRe1 = u'哈书'
      C% O' y, j& N3 h: [2 C& x
  202.         NewRe2 = u'huhjsd.CC'
    # w* M( [% Q& Y: Y; t2 D1 P3 Z! P1 ]$ Q  M
  203.         NewRe3 = r'^\\n\\n'0 `( B* W/ D, V1 g- d) S
  204.         NewRe5 = u'小说网'
    : y; X# `; e( _9 ~6 y+ x
  205.         NewRe6 = u'fgdfgf'
    ; w) d% m: s+ S$ c1 G
  206.         NewRe7 = u'fgfgf'
    - r; y( Z+ g  T7 n% J* X2 r! S1 V5 K
  207.         NewRe8 = u'ffhgf'7 P8 Y! S9 r, b& Y/ M0 j
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'4 v. Z# A7 [, M
  209.         ReC1 = u'静思'( o' b! \( R, z9 i; P
  210.         ReC2 = u'aghgf.com'" C& g* u6 \* s; m' F* o
  211.         ReC3 = u'aghgfh.com'
    4 H) ?8 K( e+ M3 T2 u" C
  212.         ReC4 = u''2 @2 l. ~) t/ g/ h6 e
  213.         ReC5 = u'文学网'
    4 ]& _& N# u" Z
  214.         ReC6 = r'<BR>', J) j4 K# q' I! E( [9 n
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    2 _) O. E: H% h& `3 A
  216.         print Bookname$ M: h2 q# u: j& h* i1 a% S' y, o" g8 x
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类8 {# M3 u+ D& F/ w; x2 K3 M3 H
  218.         Book_author = response.save['Book_author']   #小说作者
    : G9 \* O* y. I8 U* ^
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介' F4 {! F4 N/ ]" L8 \: V
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新% b! M+ f: Q5 s+ f
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    5 E7 v1 ^0 z* k
  222.         Bookurl = response.url   #小说网址4 E$ w) m5 G1 f, U
  223.         Booktitle = response.doc('.article-title').text()   #章节名称! T7 p; n; R  O- k3 I' `
  224.         BookID = response.doc('.readset-r span').text()   #小说ID1 Q. D; f" |8 }% u1 C. C1 u, d" n, I
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    , N9 Y" M# m0 {5 z* ^" ^
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    8 l6 v. M4 v8 l2 Y
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间* \2 r: u( f/ n, I
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)9 U3 I+ \% _9 ]$ p- D% D
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    : x# E+ M( R* |! g; k; r! r
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    5 W) F$ X6 j# k7 m
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)) V, U* x& l. q4 Y! C! ]) P
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    ( h) \( y$ i5 k
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)9 W  u# I% w$ @3 L  e0 j
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)8 h" X" b9 g$ `% h' ~' A1 G
  235.         BookConte = BookConte4.replace("\n\n","<br>")! R2 Q5 R; r, }$ x
  236.         print BookConte
    + U% n: H! j" k2 o9 [: @
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)2 J7 v8 u  L( g
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    . m5 l% X# `: t3 l
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)+ H5 O' h& |* x/ i+ }" P2 L
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)9 `' p' y0 i( o: Q2 F- H
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    : s+ Z' ~" K; n( S! ^
  242.         Book_img = response.save['img'],  #小说图片3 f7 o9 Q3 N) q4 a" c
  243.             
    2 K3 ~+ ]2 {( E" x/ l* @" w
  244.         #insert into MySQL 小说入库
    + x2 ?* h. J4 i0 X
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
      m: @% _+ w$ [
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布4 e* k0 q6 U5 S& L
  247.         #post提交发布2 j* x% o% \, q& O: N$ @8 a
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消9 ?- H! E; v$ j: o- G" u4 R; ~
  249.         Datos = {  {4 o; C6 r4 v3 \. e$ v4 T
  250.                   "Cater_Name":response.save['Cater_Name'],3 B. c& p! ?5 p; u
  251.                    "Book_author":response.save['Book_author'],: d7 M$ ?, N, Z( a; V
  252.                    "Book_Introduction":response.save['Book_Introduction'],$ ~7 Z2 I& p" g' b  \
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],& Z7 Z& f" d2 F2 e( D
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    9 F$ Y, U( B  \) l/ E6 `
  255.                    "img":response.save['img'],
    ( I3 e" z1 [3 e% Y/ K
  256.                      }0 I9 b5 A8 _7 E6 Q, l0 @
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    - [+ Q- x& p/ F  S3 i$ @0 W6 f9 G
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    $ b7 X: a3 `! z/ w7 H( |5 I$ L% C7 U
  259.         return {
    " V. Y1 q& T9 u+ [* Y
  260.             "Cater_Name":Cater_Name,
    # z3 g  S0 e: n! S+ ^
  261.             "Bookname":Bookname,
    ; R) i# F9 W, q7 A
  262.             "Book_author":Book_author,
    ' Q$ @9 y+ {+ t& P2 Q
  263.             "Book_Introduction":Book_Introduction,: M4 X+ d7 Y, W
  264.             "Book_Synopsis":Book_Synopsis,, w6 Z1 N* O/ K
  265.             "Book_Palabras":Book_Palabras,. N0 `# A7 X2 Z
  266.             "Book_img":Book_img,. w& l: c* m0 V
  267.             "Bookurl": response.url,
    ' a  `( p- }! t0 h
  268.             "Booktitle": Booktitle,* b5 U, v8 v( a2 |- R
  269.             "BookID": BookID,
    # {) Z" w0 D* Z, j8 D8 f9 _
  270.             "BookConte": BookConte,7 i( R+ t8 ^( p+ }) J
  271.             "Titleid": Titleid,
    & k: a7 o$ w8 m
  272.             "abover":abover,# j* r6 n9 {1 v/ Z
  273. #            "Book_Date" = str(datetime.datetime.now()),
    1 a. K. j1 z6 E, v3 m
  274.         }
    9 i7 z# f3 H! T* [' ?1 k9 M
  275.     def download(self, P_dir, imgDir, file_name, Book_img):5 O- L# C; Q, b. ~9 o" N, _
  276.         if not os.path.exists(imgDir): 5 @8 o  w* _. ?  S
  277.             os.makedirs(imgDir)
    . A" }! N- _' D
  278.         file = imgDir + "/" + file_name
    2 F1 S: c3 Y9 z* V9 F
  279. #        print file: R% t) R" o& y  E4 z* j- u; ^' o
  280.         f = open(file, 'wb+')
    * _( g0 ^8 n  B: Q+ s* r
  281.         imag = requests.get(Book_img) ( L' q" w" O% f
  282.         f.write(imag.content)- m1 A( w) n) f4 @
  283.         f.close()
    ' m4 L/ q) E( N; U/ I) h; s
  284.         #保存图片前
    . k, x* _1 {: E8 k" D
  285.     def save_imgs(self,response):, X+ T! z" M& E0 E" a/ R
  286.         content = response.content
    ! X" m" x+ H: ^( R, T
  287.         file_name = response.save["file_name"]- D5 q( ~4 d- \( J: {+ L* l; t+ z
  288.         imgDir = response.save["imgDir"]
    4 ]9 T2 P" }9 l4 C- ~' e8 i. S& L, Q3 F0 C
  289.         file_path = imgDir + file_name
    * w5 }/ B( H5 g" y$ d9 Y4 v
  290.         self.save_img(content,imgDir,file_path)9 ?+ {1 V* a9 I. A2 S
  291.     #保存图片
    * v, a, o% t$ X+ I; G$ S& S% Y4 u- p
  292.     def save_img(self,content,imgDir,path):
    , o: U. Y/ G9 p- f1 |" r7 E
  293.         if not os.path.exists(imgDir):                        
    - e" {2 Y! f6 m& ]
  294.             os.makedirs(imgDir)
    $ q; Y5 M/ A* n
  295.         f = open(path,"wb" )
    ; v1 P( G2 h. v! F+ H+ w* }" R
  296.         f.write(content)
    . }2 K0 w8 C3 z' ^
  297.         f.close()
    : w1 b4 C/ Q4 U8 b$ V# }/ o
  298.     #获取url后缀名. s1 d1 c9 W& E$ B3 x1 e
  299.     def getExtension(self,url):                           
    " o) F' k! Y" Q" v, w' h! B
  300.         extension = url.split(".")[-1]
    ; E/ q/ j: h8 I! O( O) x
  301.         return extension 1 M# {2 h! s- I
  302.     $ W. a  b$ G8 K! u" q
  303.     #获取图片名+ E. F* A  q7 ~8 l/ }* Z& {6 S
  304.     def getname(self,url):8 V5 s3 c5 N, F0 o" |1 M7 ~
  305.         name=url.split("/")[-1].split(".")[0]6 g" e" \2 w3 M$ ?, c. G( o
  306.         return name
复制代码

, y' q0 L9 U& f" i1 {

, J/ l  R, S4 `# P. g
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-16 17:16

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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