找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
9 [; S4 x" A9 f
  1. #!/usr/bin/env python, q# H; `% U" C; C
  2. # -*- encoding: utf-8 -*-
    / `+ E2 t* }8 O0 O
  3. # Created on 2019-05-05 21:43:11
    9 P9 H* K  G5 o# e' m& g
  4. # Project: XiaoShuo
    2 r! X& q' k9 ^: D7 u1 k
  5. 3 z0 B- ]4 w  W3 M
  6. from pyspider.libs.base_handler import *
    7 ^" I' H. u  ?8 v; r
  7. import pymysql# d1 h6 N, p% T# |' w
  8. import random# ?5 I, |  i/ P$ m- }
  9. import datetime
    + N0 L! z6 q, V- P
  10. import urllib2,HTMLParser,re
    0 Y+ H& g1 k+ u+ h1 _
  11. import os5 f  K# q6 x& k1 |
  12. import sys( }) ~- s& C" |1 W4 e! Y2 n
  13. import re
    , |' ]8 ?' Q' r( Y) J
  14. import codecs
    8 f/ W( a: R5 C1 o, [
  15. import requests
    * }' s! W/ o% a  s7 {4 W
  16. import json
    7 a, p) B! |  i7 e2 n, [. n' j

  17. . M1 g( u/ c* s
  18. class Handler(BaseHandler):
    / ~1 a) w5 t( a8 g( @- q+ e
  19.     global Datos3 |9 K* k4 p: o0 Q. G) n: a6 v& N
  20.     global P_dir   
    / J: C  f7 G; j
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径1 w  a# N: T& E# m+ _# A, z
  22.     global Datos: d* j# S. b, I5 D9 u
  23.     Datos = {}
    6 V( D: e/ N* `9 m4 t
  24.     headers= {
    7 V' v3 X# [/ I9 a5 w
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',  j9 ^' R; b; M
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    ; s5 P+ S4 ^) C6 W
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    # K# R( c( H& O# R8 E' m
  28.     'Cache-Control':'max-age=0',
    ' m0 t( _% y" |/ B: @9 M( ^
  29.     'Connection':'keep-alive',9 i2 w( l9 c" r! e
  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'
    9 Z3 H, \4 i5 k6 J1 Q& i
  31.     }
    + p, {0 L% K. u6 F8 |
  32.     crawl_config = {
    ' p8 f  G5 `. x2 d/ o' P, |
  33.         'headers' : headers,
    8 B% u* p7 d* n8 a
  34.         'timeout' : 3008 e, @3 }: I/ O1 w  u
  35.     }
    4 E2 m5 g( @; ]' U# y6 P! D2 Y7 A- t" v
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):. s3 v+ n( r2 l# v" K9 I7 Y
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    & V( W4 H$ f6 ?1 R5 I8 U
  38.         try:2 }$ y7 ?! n/ w8 ~# K8 Y' L2 v
  39.             cursor = db.cursor()
    ! H9 Y- j" t8 h7 L* [
  40.             #注意此处字符串的占位符要加双引号"%s"
    ' U) @+ z) y# n$ Z
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);, v: l0 c1 O1 H
  42. #            print(sql)
    " h: m* D# G$ f3 c
  43.             cursor.execute(sql)/ J( p) C3 V) w2 W8 E& B5 ]; V
  44.             * B' \+ @* G" r; V  E! L2 ?8 [) ]
  45.             #qid = cursor.lastrowid" Z2 i; p8 p# w4 j6 D( I6 M
  46.             #print(qid)5 J, h2 j3 W! a6 f
  47.             ! D$ ]; ]$ k" l, N# u
  48.             db.commit()5 R8 g* c% G* o  _$ y
  49.         except Exception as err:# P5 c5 M, \& l& C6 [4 _
  50.             print("Error %s for execute sql: %s" % (err, sql))
    3 n& |1 ~4 O" \: C+ ^& ^7 \. d
  51.             db.rollback()
    * @. x, @8 [# k( v9 B0 a* d5 o
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    & g: x) H$ C4 W% b- f
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")2 d- v% r& O; n* ^- d3 Q# w- b( D+ w
  54.         try:# C/ m  H; a% p8 n4 d
  55.             cursor = db.cursor()$ k1 d  e. u& {5 p1 P! D
  56.             #注意此处字符串的占位符要加双引号"%s"
    2 o* F& g/ V% x" U
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    9 R" J3 E" N( n+ _5 W- T. \( Q& t
  58. #            print(sql)! f  `9 h2 \8 N% z7 X
  59.             cursor.execute(sql)' k' b' C& S3 s5 v
  60.             
    & g- T& J+ y& A- C/ z
  61.             #qid = cursor.lastrowid, y% u  I' `6 P: `
  62.             #print(qid)
    8 F: P8 ?; l* f
  63.             
    & [3 W( P, d7 v' h
  64.             db.commit()7 S0 E' B: Q" g/ X
  65.         except Exception as err:
    2 Y+ n' s! N. B1 s% w+ J: D
  66.             print("Error %s for execute sql: %s" % (err, sql))0 i+ m+ E: M) k- [6 z8 t
  67.             db.rollback()
    , k4 b/ E# I  S6 s' j
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
    . A8 v' Q# ^2 a1 q5 X
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    + L+ ^3 m/ M6 k) a) u
  70.         try:
    # X$ ?5 f4 _5 [# a- V
  71.             cursor = db.cursor()" ]. \0 ]$ N  l1 e/ X9 n; B! h
  72.             #注意此处字符串的占位符要加双引号"%s"- J/ Z% M$ @$ R, t6 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);
    / L" Z4 x; k3 R- c
  74.             print(sql)
    . I6 [3 L3 X4 \1 _
  75.             cursor.execute(sql)
    / [" B8 ^( A4 S* o+ B
  76.             print(cursor.lastrowid)- ]8 |, z! W2 _4 f/ R
  77.             db.commit()& Q. e- q+ S7 }6 o$ ?
  78.         except Exception as err:2 j; b; |  W; A' r: |! n) R
  79. #        except:: a' K! C: Z) t; ~9 b! H! U
  80. #            print('Failed')1 W9 R/ g$ c4 ~* D3 C
  81.             print("Error %s for execute sql: %s" % (err, sql))
    * P/ O: d# |# X* L- L" t# w" i
  82.             db.rollback()
    2 S4 U+ ?& o, V9 o
  83.         9 A( f$ z0 q. _
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    . z+ v" _8 T1 L# Q* g
  85.             reload(sys)) B- T5 }1 i# J: T
  86.             sys.setdefaultencoding("gbk")
    2 w- m" d" `6 g" h
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    ' M( f  k9 y# Y- v
  88.             locoy_data = {
    . Q' G- F* m2 D! U$ `0 [; I% r+ R
  89.             'my_u':'用户名',   #后台用户名
    ) G* `, R0 n5 X& i1 T
  90.             'my_p':'密码',   #后台密码
    " }  E' Q5 e' K# d/ u
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),$ J' z% a# }. O$ C6 k5 @: F
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    + t+ p: u1 c6 v4 T; V6 }: ^
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),2 f$ W$ D2 t. V0 T$ A+ ^% L
  94.             'article':BookConte.encode('gbk', 'ignore')," U6 j7 S& w+ J/ Y( u0 b' m
  95.             'author':Book_author.encode('gbk', 'ignore'),# J8 l4 L8 x6 |* ~/ Z( p5 [$ }
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    0 @4 I1 X, I0 [
  97.             'thumb':Book_img,  N" T' j4 E6 b( j+ t) _, L
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    " j  }, I5 R0 V( \, w) ^& L
  99.             'abover':abover.encode('gbk', 'ignore')           
    ) J2 Q$ X) {3 B0 J) V9 r6 E: o
  100.                 }# j7 t2 D1 z: i7 Z/ N4 G2 [
  101.             res = requests.post(locoy_url, data=locoy_data)
    ; v$ P8 O' `0 K2 g
  102.             print res.text
    ' w3 E3 }) A/ u
  103.             print res.content0 @0 H1 V0 R0 x- k
  104. #            print Dsd
    0 B. [8 e' @+ L3 L. v4 i3 N' c
  105.             return res
    ) ^5 u5 Q/ `, U5 i
  106.    
    : P) r* i- ?/ a- }
  107.     def __init__(self):
    % V8 \0 K. R& p6 J# g
  108.         self.base_url1 = 'https://www.****.cc/'
    $ C% a0 H! K8 A6 s% A
  109.         self.base_url2 = '/'
    6 L! Q) `% v5 `
  110.         self.CaterId = []
    ; k: x2 Z. C3 X, H2 ?, i2 z
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']2 ^" s& G5 W0 V6 {( c  y0 p0 U0 S
  112.         self.page_num = 1
    1 o+ P- T9 @- ?" s) E
  113.         self.total_num = 200   
    3 z! M0 k4 e4 P" [& F8 |- X) v
  114. 6 T/ K7 ~% ]: ]
  115.     @every(minutes=8 * 60)2 B. R0 p, b4 u. q3 [
  116.     def on_start(self):# v5 b5 d7 G  I( k" _; y* M' O
  117.         global Cater_Name
    - U5 {4 K* Z2 k6 W1 d3 w* F
  118.         Cater_Name = []0 g( e- y5 W/ J9 W( U4 }( z: Z' h
  119.         while self.page_num <= self.total_num:
    . [) M; m' t" C$ p
  120.             for self.CaterId in self.CaterIds:
    6 m+ z" q$ N9 P6 j6 P. m9 `2 ?
  121.                 if self.CaterId  == 'xuanhuan':9 G3 C# z' l$ E% `1 m9 ]  ?. O
  122.                      Cater_Name = '玄幻'
    $ r( G* q6 Q+ }' f9 S1 P6 |6 f
  123.                 if self.CaterId  == 'wuxia':
    ! i; F# H% k$ p) Y
  124.                     Cater_Name = '武侠'' |7 D+ j- N6 A$ `
  125.                 if self.CaterId  == 'lishi':
    4 ^" S4 F; w* |, T7 q1 }+ H
  126.                     Cater_Name = '历史'            
    : J* _9 w# N1 d+ t
  127.                 if self.CaterId  == 'yanqing':2 a8 e' N. W: q& v1 w) u
  128.                     Cater_Name = '都市'
    + S; Z& |5 _, [( t  t3 q2 V% W
  129.                 if self.CaterId  == 'nvsheng':1 Q# x5 \/ m, s7 ?$ q1 n- n2 K
  130.                     Cater_Name = '都市' , P4 v# a! I* i( m; ^- ~  `
  131.                 if self.CaterId  == 'kehuan':
    0 i7 h- M3 z& V. G& d* W8 u* I& a6 V
  132.                     Cater_Name = '科幻'
    . h. E; ?7 `# \: M1 k
  133.                 if self.CaterId  == 'kongbu':
    4 h! M. P9 ~. L+ t# J) I
  134.                     Cater_Name = '游戏' , d- u$ X# b9 Y8 ]  t: Y
  135.                 print self.CaterId
    4 G& m- b) D( V# f  b) E. L! S1 {
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          6 ~5 E1 [0 }0 |5 o: Y
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)6 B1 m& r3 k; K- H3 G1 {. i
  138.             self.page_num += 1
    5 _7 \1 a6 I! `, i9 h$ |, Z- P7 {
  139.             
    6 z+ K/ x+ a+ f" h# w( y
  140.     def list_Caterg(self, response):
    * ~$ F% ~, s( i! G
  141.         Cater_Name = response.save9 V' X: s  Z9 B, f
  142.         for each in response.doc('.pic-list a[href^="http"]').items():9 E2 f7 G* M5 C
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)2 O  X8 `4 u* W) k5 {+ Z, a4 _
  144.             
    ! T7 O0 J# j3 P! e/ c
  145.     def list_Caterg_detail(self, response):
    0 S6 I+ Z  I  v) x/ ?* c5 G
  146.         Cater_Name = response.save& v1 ^1 T, p- J9 [  y& ]0 W& |) F
  147. #        print Cater_Name
    5 c6 {' P0 t* p+ L+ I/ b
  148.         Bookname = response.doc('h1').text()  o& I, R/ d: \9 W6 f" M; Y3 D( @
  149.         print Bookname
    ' x* b2 J3 Q3 X% z7 h
  150.         Book_author = response.doc('.authorname > a').text()
    # B  B' G' _) c7 P
  151. #        print Book_author
    . |) b2 ?9 C, G4 c* f% b1 o
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    0 x2 n; R, K% }* G. O" L$ O+ a
  153. #        print Book_Introduction
    4 z# b, f" ^3 D$ t$ l$ B7 s9 @7 |5 Y$ a
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    ! Q) e; i$ H" G* M
  155. #        print Book_Synopsis) s& `  C. ]9 p7 F
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    . Q. L& K) U1 V# D7 v3 i# U
  157. #        print Book_Palabras
    & U! q7 B7 h( l" J' f
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID. Z1 ^" l+ }5 I
  159. #        print BookIDs8 H1 Z& _+ V+ s. F) ^7 f) _
  160.         Book_Dates = str(datetime.datetime.now())         
    + I& X# F; T7 y+ V$ v' J
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    9 |- P4 A6 H% u4 t+ y% {
  162.             img = imgs.attr.src
    * r1 d% F# R+ w# K+ ?& n. c
  163.             print img
    . Z4 c, m$ n+ N4 D* `* y
  164.                 #小说封面下载
    7 \, ?2 @8 @' _. y3 f$ Q8 r2 b/ W
  165.             extension = self.getExtension(img)! Q. d; S: B& Z1 V5 K7 L
  166.             name = self.getname(img)% U. d2 {" T" y; `) K6 q
  167.             file_name = name + "." + extension9 F! J0 ^) P. v; ?
  168.             imgDir = P_dir + name
    + R2 V8 ?$ {( q2 @$ w7 n9 c7 g
  169.             Locaimg = imgDir + "/" + file_name0 U0 g+ x1 r0 @2 _: v& {# J: |7 ?
  170.             print Locaimg+ F- i1 X$ g  s* }5 X( {
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    9 L2 u6 w& B* J# Y1 q
  172.                 print('attachment url is ' + img)               #
      T. r1 j! j6 h! h. _' X  Y
  173.             Datos = {  U% t5 V, m) f
  174.                     "Cater_Name":Cater_Name,
    / U8 r, V+ ^) G5 p
  175.                     "Book_author":Book_author,- |! h: n" ?+ H$ B# U! v; U
  176.                     "Book_Introduction":Book_Introduction,. c9 w2 S' w2 `" x3 W. k
  177.                     "Book_Synopsis":Book_Synopsis,( H+ Z8 }7 w5 s$ `  k
  178.                     "Book_Palabras":Book_Palabras,
    ; B8 X4 ?: K( p
  179.                     "img":img,
    $ V  Q7 t$ \. L$ O$ u* y( D1 V
  180.                 }1 H1 p; ~7 P9 h" a8 T# W
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布+ i+ k. L: H+ h; q- ]1 X
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    6 N6 ]& ?3 Y2 b# t# V
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)9 s/ f7 U: I4 B2 b4 R
  184.             
      X7 y3 k$ |7 v/ I% Y
  185.     @config(age=8 * 60 * 60)    $ u0 {9 u0 r/ G+ e! X2 _
  186.     def index_page(self, response): / a- }' G, l9 m, `! [9 t
  187.         Datos = {/ M% q1 J  ?  t
  188.                   "Cater_Name":response.save['Cater_Name'],
    " J# V8 m. _5 G0 ^- [# z5 c
  189.                    "Book_author":response.save['Book_author'],
    0 G* V: ?& Y( e- \5 J
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    ! _2 c# v) f: U1 N
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],0 j  f! c0 S3 X7 P2 l
  192.                    "Book_Palabras":response.save['Book_Palabras'],# x( T. Z+ N* ^, F/ _- s6 |
  193.                    "img":response.save['img'],
    . D! p2 A1 e* h* M" i' Z7 K# N
  194.                      }4 N( a! B1 }$ l- ~% \, p6 S1 O$ u3 L( @
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():' V, ]" [, f( o: z1 C
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    7 p9 z& Y7 `3 t8 G+ v. O% K$ O
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    7 y& Q4 c4 N' ^6 ?) E7 A0 d
  198.     @config(priority=2)
    - C5 Q0 J$ I3 Y6 [, A+ R1 X: m& z. Q4 l0 m
  199.     @catch_status_code_error
    8 X7 ~0 h+ A+ W! w( N2 V  _) A
  200.     def detail_page(self, response):        2 q! I2 d+ I' V. A; G* o
  201.         NewRe1 = u'哈书'
    ; i1 W3 D2 K  @! \
  202.         NewRe2 = u'huhjsd.CC'" F, r$ d. D/ W6 F# T2 M
  203.         NewRe3 = r'^\\n\\n'
    - C2 Z- J* |% i. _% t; X# o6 O
  204.         NewRe5 = u'小说网'
      X; N+ _) Q* r1 a  Y
  205.         NewRe6 = u'fgdfgf'
    3 O4 U0 q6 W3 \2 F5 V- ?/ a1 m
  206.         NewRe7 = u'fgfgf'
    + S7 L9 \4 ]9 f2 P/ R7 A
  207.         NewRe8 = u'ffhgf'
    * t* O9 Q# O. K" `; T& A
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    1 W% I6 t" `3 t2 y$ V" k* _
  209.         ReC1 = u'静思'' k6 o5 r3 @& {  j* U) l: ^0 ~- ?
  210.         ReC2 = u'aghgf.com'  \. t: F' _2 q# X' I2 l4 A$ V
  211.         ReC3 = u'aghgfh.com') k# z3 Z( g6 v3 `9 q6 D4 X: U) `
  212.         ReC4 = u'') X8 w4 \4 ]  J/ }" o7 ~! P
  213.         ReC5 = u'文学网'" r7 e7 g, Y2 |; n
  214.         ReC6 = r'<BR>'7 l& J0 q4 Y5 x9 R- ?# f, D/ o
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    5 M" A5 w4 F6 W
  216.         print Bookname
    2 y0 l: a" k& Y( @- t- h
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类. T* P$ V, A1 e' \% E6 u
  218.         Book_author = response.save['Book_author']   #小说作者8 j  V# h8 D$ |. D  q3 A
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    ) o5 X; G) A; [. B' w/ E" o# g7 ~
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
    : n6 `7 p  T) b: n; _
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数2 M% Y* P" }7 {, }( E& ^$ b+ a
  222.         Bookurl = response.url   #小说网址$ M; C5 U, G$ ~0 a* m
  223.         Booktitle = response.doc('.article-title').text()   #章节名称5 c2 K- f0 P, T- c2 W$ S
  224.         BookID = response.doc('.readset-r span').text()   #小说ID! J9 s- b2 Y/ \7 G/ ~% N% k
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容8 N! _% b! d% x2 G9 n7 O
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    9 [; M; s; i! i+ `0 v9 W
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    & i& O- F- ?6 n3 h" z7 W
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    ) _' ^! _. }. x% L+ _
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    + Y3 A& P5 U/ \; D
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)% m3 b6 _8 o" M" W1 G" f# F) h
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2), }* \% B8 i$ L' I4 Z# ?. }
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    6 e5 C- j5 ~9 T6 g0 k
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    : b7 g& G9 C$ Y3 j6 _
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    , Y! P3 Z9 c5 Z, H9 n
  235.         BookConte = BookConte4.replace("\n\n","<br>")! s* m, L/ N  X- Q
  236.         print BookConte
    1 ~- [- @2 s+ z/ m$ ^; n
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    : L7 h' Q. Y% `, \& r0 y
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    3 n! ]( K* e! k" E" O$ g# a& {$ R3 H/ I
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    0 d5 ~' W  \0 l5 P& p, V7 j/ {
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)9 H' w. ~$ [0 J. V8 [0 Y
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     + [# X" C, P3 V# z+ V
  242.         Book_img = response.save['img'],  #小说图片7 ^; ^3 i3 a! |8 e' O1 e( t
  243.             
    , D4 r1 f  Q& z6 a6 W
  244.         #insert into MySQL 小说入库8 D: K+ ]3 [- @) L3 s1 p% x
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布2 h/ }" b0 C1 L1 w* d
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    4 |, x( |9 X( s2 \/ R, r7 ?- t
  247.         #post提交发布! a* a" C( N% U0 x
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    , \, l! g5 Q: e7 o
  249.         Datos = {
    3 O  w) T7 k4 G  }
  250.                   "Cater_Name":response.save['Cater_Name'],! U# {5 {2 h/ G2 o6 e
  251.                    "Book_author":response.save['Book_author'],
    ! u/ {, |* w/ A& i: g$ Z
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    6 I/ i! t/ Q7 \( q6 n" w
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],) L8 a. c& ?8 p) ?, d- {0 R% t
  254.                    "Book_Palabras":response.save['Book_Palabras'],8 ?: M* r$ B) R: R9 m6 g
  255.                    "img":response.save['img'],
    4 s% M* D+ v: b
  256.                      }
    3 Z9 K7 S  s1 j$ A9 [
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():3 f( p2 ]4 K* r8 w
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) ' L5 l' e$ Q- |+ ?/ m
  259.         return {# A- z) f1 c9 |' f3 s
  260.             "Cater_Name":Cater_Name,: W" O- _5 `8 r& S, F
  261.             "Bookname":Bookname,2 Y) ^: A* X8 U2 y$ T
  262.             "Book_author":Book_author,( j8 u  F9 `2 [. e* ~7 Q. ~, n
  263.             "Book_Introduction":Book_Introduction,9 M+ f. [5 P  k6 V% F
  264.             "Book_Synopsis":Book_Synopsis,
    . i2 \+ o# I/ M, T* d3 ^/ \
  265.             "Book_Palabras":Book_Palabras,! ~' @1 C: }. W
  266.             "Book_img":Book_img,) Y% y# L. D) T& I. x" O7 {
  267.             "Bookurl": response.url,
    1 c# C6 n" y6 B
  268.             "Booktitle": Booktitle,
    0 Q) Q3 p" \4 d  o3 q2 \9 T( p
  269.             "BookID": BookID,6 G; g0 }2 i7 N* f) F
  270.             "BookConte": BookConte,
    2 ^- A* k6 s5 s3 l1 ^5 b% h+ T
  271.             "Titleid": Titleid,
    ! D0 _7 E  i/ i
  272.             "abover":abover,
    ) ?1 L# c( `$ K
  273. #            "Book_Date" = str(datetime.datetime.now()),
    $ k% |/ @" ^6 e: Q7 t" M! h7 g% W
  274.         }
    / V2 o) y& B; j; ?5 p
  275.     def download(self, P_dir, imgDir, file_name, Book_img):' G4 l9 {4 {( B! j" d" B$ b: E1 n
  276.         if not os.path.exists(imgDir):
    4 W# y$ }  `- [8 H4 _
  277.             os.makedirs(imgDir), t" b9 x% g0 y$ L: n. V. m3 E) [! b
  278.         file = imgDir + "/" + file_name
    ! h: e  w' t# {
  279. #        print file
    ! T$ I$ H6 E  f; w# j8 S; }
  280.         f = open(file, 'wb+')- W5 k* e, `- m: L+ ?  O6 ?- U" x
  281.         imag = requests.get(Book_img)
    ( t8 ?! J5 B4 L7 d/ S$ v& p
  282.         f.write(imag.content)
    0 O& \; d# K' \" {5 i0 b+ T. D
  283.         f.close()
    2 p: ~2 M6 z& z
  284.         #保存图片前4 ?$ L6 X2 v+ ]* A
  285.     def save_imgs(self,response):; e2 b; E1 ^0 G2 M! S( v
  286.         content = response.content
    " k7 E" d8 g% d# |* J8 A
  287.         file_name = response.save["file_name"]
    ; l' f; ]/ D2 n8 h% t
  288.         imgDir = response.save["imgDir"]0 x3 ?3 i6 y6 Z2 Q+ L
  289.         file_path = imgDir + file_name5 W) h0 S/ W- S; \5 q0 W
  290.         self.save_img(content,imgDir,file_path), q( d( F6 M' g" T7 Y3 O
  291.     #保存图片
    8 f' k) j: [% d' x8 h
  292.     def save_img(self,content,imgDir,path):
    ; s- z6 Z- C7 _1 V" b6 M* a
  293.         if not os.path.exists(imgDir):                         % ?" w/ G  Z; n2 U8 g; H) w
  294.             os.makedirs(imgDir)  b6 W( e6 @% N+ \" b
  295.         f = open(path,"wb" )9 G" k8 u4 v' G: |+ B0 e4 o0 _3 s) E
  296.         f.write(content); V- X( C5 r# @
  297.         f.close()3 h: H. o7 d2 T
  298.     #获取url后缀名, l% {' J, U& n8 G
  299.     def getExtension(self,url):                           
    : ~2 w  T* B; X$ T
  300.         extension = url.split(".")[-1]/ Y$ S% ^: x4 t5 V  h! R& `
  301.         return extension
    1 j, o$ l, h1 O1 c0 i* u
  302.     * [% ?3 C  h3 M6 ]! X
  303.     #获取图片名
    1 v) y6 x, ~- R; I9 \: ^) A
  304.     def getname(self,url):/ A! P- A9 f2 G2 A2 x" c) X
  305.         name=url.split("/")[-1].split(".")[0]. j! }! X7 n# \. h/ e3 k, i
  306.         return name
复制代码

7 X6 Z% `8 L$ b  l+ b6 r
  y- ]% E$ Q4 J& x' V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-21 23:19

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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