找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
8 Y3 G5 N. F" O$ h; w
  1. #!/usr/bin/env python
    / y; V1 ]) V. t
  2. # -*- encoding: utf-8 -*-- g$ _* R7 d- Q) {) O
  3. # Created on 2019-05-05 21:43:11
    1 I" G* Y( e( x
  4. # Project: XiaoShuo1 q; H/ a! r+ ]; h& @

  5. 8 Q: w1 E7 i5 p& A+ A; V
  6. from pyspider.libs.base_handler import *, d0 T) E- i" Q  W! S# d' R
  7. import pymysql
    ' V3 k8 ~7 L% J7 a9 V4 a5 m9 J9 e
  8. import random
      h. @. O: j/ G$ c/ q
  9. import datetime
    3 S' r/ g, d# q0 d
  10. import urllib2,HTMLParser,re
    5 t* t% p+ D- d  V6 q3 g4 C$ F* h
  11. import os' H8 T6 H* A: Z+ ~7 c# q1 b: l9 i: ^
  12. import sys
    , `- W" o6 z8 R$ n
  13. import re
    + c' d. _3 M' l# `1 ~" v$ ~
  14. import codecs
    ! a# `; L% ?' E- P: B
  15. import requests
      _) Y1 O8 A& n7 w: z
  16. import json
    + C7 [5 f, c" B  A% ~: [0 E
  17. ! I5 ?1 O6 P/ q1 R
  18. class Handler(BaseHandler):
    ) L# i; V' T0 ?) [  }9 E
  19.     global Datos
    1 w" G9 K; k+ l( z& b) B
  20.     global P_dir    " f% P7 B) x! t, }
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    % l4 p$ b) {% A
  22.     global Datos8 ^; S0 G+ Z# t% y( A5 X' @8 g
  23.     Datos = {}
    4 x7 X% G6 ]/ K
  24.     headers= {4 L0 [- d' ~' `7 ~; s& s
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    ' O2 |0 q3 l% o7 c: ]
  26.     'Accept-Encoding':'gzip, deflate, sdch',$ I0 |2 B" ]" W4 p' n
  27.     'Accept-Language':'zh-CN,zh;q=0.8',$ M0 p% M5 ?$ @/ {$ U* \* R% J
  28.     'Cache-Control':'max-age=0',
    3 p6 V( `* C8 v  }! V2 m
  29.     'Connection':'keep-alive',' L+ w0 o% J$ Q$ C% @0 ]2 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'( |. s. l% {3 Z
  31.     }% S( e% T' K5 k
  32.     crawl_config = {
    & `! s1 H& ^& Q$ M" A' o
  33.         'headers' : headers,
    3 n! B$ C; ?3 n" m" t7 ]
  34.         'timeout' : 300+ n9 {* X' t4 p) M# q% Q! P" Z
  35.     }$ T* S1 G- D. a! R
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):" }5 X( t2 O* T6 u$ g& ?1 e
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ( }) S3 H, K& _9 S5 f) b0 m
  38.         try:) \) N: o' L1 l' Q2 t  ]4 Y6 E
  39.             cursor = db.cursor()7 a  h. j" i/ g' `/ T2 r% K4 K
  40.             #注意此处字符串的占位符要加双引号"%s"
    4 T( y+ ]/ i  V: |
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    ; P+ S' x) @9 y6 ?2 X  [# q# r- N
  42. #            print(sql)
    : [4 J2 e* |$ f: y5 m+ {; ~, N
  43.             cursor.execute(sql)6 _1 j+ l0 s0 j- [
  44.             
    1 n3 P  o' D1 ?. J, m
  45.             #qid = cursor.lastrowid0 O# i6 s. d7 k0 V
  46.             #print(qid)3 C0 b5 G& g- x+ U; t
  47.             8 n2 `2 x9 I* y' \0 p9 Q1 M- i& d: e4 f
  48.             db.commit()
    # r6 o9 f5 f: M+ ]
  49.         except Exception as err:
    & H  @9 H; ]' u
  50.             print("Error %s for execute sql: %s" % (err, sql))
    4 ?3 v  E; B* Z+ b' Q! g8 j) y5 _
  51.             db.rollback()
    2 U) J7 C. l. z8 `
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    1 e4 G# o% y% F  r' Z
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    % A+ i( X. K$ Z/ f1 F; Y
  54.         try:
    1 U4 y; I8 k# u0 ~1 ]) n& [
  55.             cursor = db.cursor()
    5 k" |7 a; D3 b8 m: c8 q3 @
  56.             #注意此处字符串的占位符要加双引号"%s"
    5 A3 [  w, H8 s
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    ! J* F  ?% P' A9 _& b
  58. #            print(sql)
    $ l- E7 P1 h: E, J% Y, J
  59.             cursor.execute(sql)0 N2 w) ~$ M& l5 X5 N5 W
  60.             $ C4 Q& U$ e* U  k+ h. Q8 J
  61.             #qid = cursor.lastrowid
    7 h  ]3 X$ U( O! G
  62.             #print(qid)6 }4 h; r1 `9 J% t& _
  63.             " Q7 Q% X( b  Q& B! P- A8 Q
  64.             db.commit()0 V) N4 j) [& v/ y9 F3 ~% M7 B) h
  65.         except Exception as err:, Y. e* F) n1 A% L$ X
  66.             print("Error %s for execute sql: %s" % (err, sql))  d" [8 z) x0 e6 V7 l0 c; X
  67.             db.rollback()7 H9 m: L5 S. I' a0 c/ 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 L( ]6 H: ^. X5 K/ N. Z
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")- G0 }8 x5 E5 P$ g6 J
  70.         try:
    9 U9 [; Q( R$ T1 j9 ?8 B( N7 {
  71.             cursor = db.cursor()
    3 L' e. T: D2 o
  72.             #注意此处字符串的占位符要加双引号"%s") F3 d  _7 _/ T1 R7 M6 S# i
  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);8 `- ~1 Z: |, {, o. ^/ B
  74.             print(sql)8 \/ j  Y4 Z* X  i) p! w! }
  75.             cursor.execute(sql)
    * j4 w: Y* @2 t" g$ |0 X2 ?2 P" }
  76.             print(cursor.lastrowid)1 P; S9 v* i8 L3 R, |
  77.             db.commit()  v7 Z" E5 `. S: }
  78.         except Exception as err:
    ' V, i% T" C5 I4 k% H1 v
  79. #        except:! K% z2 X+ I% H+ Q4 y, w4 V
  80. #            print('Failed')4 `/ I) v4 t" f
  81.             print("Error %s for execute sql: %s" % (err, sql))
    & q/ q. z5 J6 M; \; |+ j
  82.             db.rollback()- k9 c) K. Q6 W; v
  83.         
    * L, S1 \$ f8 ^' n' \
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    , v" e+ C. `4 h0 a* R4 K# a% ]
  85.             reload(sys)2 [7 y  h* l. F6 S- l
  86.             sys.setdefaultencoding("gbk")5 V4 i9 X" V6 @  u
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址5 n0 C# v: f' f; m4 K1 X
  88.             locoy_data = {$ \8 [9 y, P# H* M
  89.             'my_u':'用户名',   #后台用户名7 ~! F2 W! S) y: Y# u0 `
  90.             'my_p':'密码',   #后台密码
    7 z. q" t* I* \. v0 \  d( K7 |
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),6 N+ f; y* k. w, F: t5 }) n
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),9 O$ G0 |9 L# s) |8 }1 d( r4 L& ]- l
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    / l' _! K4 s& j/ S& T
  94.             'article':BookConte.encode('gbk', 'ignore'),8 s% B# K4 i) Q& J/ U* U
  95.             'author':Book_author.encode('gbk', 'ignore'),
      u+ G) d, m2 H* D
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),# X* I  }2 ^9 J: \; f' n
  97.             'thumb':Book_img,+ W- G. J- w) P0 B  U: C6 \( M
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    5 C2 T' ]* g1 g5 B! r
  99.             'abover':abover.encode('gbk', 'ignore')           , z9 ^8 X6 r+ ]
  100.                 }
    0 m9 ~4 H1 o8 G! X1 `( t
  101.             res = requests.post(locoy_url, data=locoy_data)( O0 E5 @1 o0 b) [( Y! B8 m
  102.             print res.text6 m# U1 {& l" q/ q( W2 Y
  103.             print res.content' W' l  l1 W: t/ v
  104. #            print Dsd! k/ X# N+ ^$ n1 C' e1 N- Y) u; [) l
  105.             return res
    ! e0 }& r! |  S2 h2 ]7 F1 Q
  106.     5 p( ^: I& L" c  Z1 X
  107.     def __init__(self):
    ) y) h; c, C( m& {$ U' [
  108.         self.base_url1 = 'https://www.****.cc/'3 _  Z+ v' x9 C; C
  109.         self.base_url2 = '/'
    . j" a, c  V1 i* M8 G; \% f
  110.         self.CaterId = []
    3 F! _5 l& M3 q% W# |! b
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    7 K) x2 Z+ h- }  d& w6 v4 w0 A
  112.         self.page_num = 1
    " e7 c+ g; D0 _9 X; u+ k" i
  113.         self.total_num = 200   0 q# w3 P$ e* @1 d% a
  114. 1 C7 T  p: ^: G' R6 K- z/ v' ^% U4 P4 r4 {
  115.     @every(minutes=8 * 60)9 W$ c8 p) T$ x/ c4 }+ ?0 c
  116.     def on_start(self):
    9 X+ }/ h$ H6 J! f
  117.         global Cater_Name
    0 ^1 r# O1 G& }# B
  118.         Cater_Name = []3 f4 H" Z, \  D; B8 }" B/ B
  119.         while self.page_num <= self.total_num: 2 k% @4 C; J6 s/ {8 j3 c$ B
  120.             for self.CaterId in self.CaterIds:* q) M; r: i+ n7 [0 [0 G
  121.                 if self.CaterId  == 'xuanhuan':
    1 S* {  C0 ]% W$ k
  122.                      Cater_Name = '玄幻'
    - e% H) M+ [- L/ K/ a  p
  123.                 if self.CaterId  == 'wuxia':0 \/ S5 ^/ _! E: ?( X3 j/ E0 D+ g
  124.                     Cater_Name = '武侠'. h9 x& s3 }' j6 `- q# h
  125.                 if self.CaterId  == 'lishi':# K9 F" n7 j7 t$ O8 h1 A
  126.                     Cater_Name = '历史'            4 B0 K# R: \+ {* }1 j
  127.                 if self.CaterId  == 'yanqing':
    ) j1 g' `3 m2 `) N. Q6 Q
  128.                     Cater_Name = '都市' + L7 z5 ~6 R% M- _5 N$ P
  129.                 if self.CaterId  == 'nvsheng':
    6 ]8 t" I, q% T' {' x
  130.                     Cater_Name = '都市'
    * c( O. Y) ~4 f7 @$ ]6 E
  131.                 if self.CaterId  == 'kehuan':
    ' \  H# Q" w1 k' D6 o1 t; `
  132.                     Cater_Name = '科幻' 9 b3 o( k5 W8 [1 \: |
  133.                 if self.CaterId  == 'kongbu':& i2 p" s9 x5 ^8 k
  134.                     Cater_Name = '游戏'
    9 T; U/ y$ a$ w4 ?4 M! ]
  135.                 print self.CaterId2 }$ Q# K& \" ?: e# i" Q
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    8 l# n# Z8 `0 |$ n6 c
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name); \2 b1 c; N7 W
  138.             self.page_num += 1 9 z" C+ F* M5 v. m& C9 I5 f
  139.             1 r; w: {+ |6 z8 e; H" z( H3 u6 _
  140.     def list_Caterg(self, response):- F) g" Z$ J8 c2 ^" h4 V$ P
  141.         Cater_Name = response.save, L  |& n8 z8 _% M! l
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    ' a( A; M( D3 v) G
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)) T. c7 A/ {. i
  144.             , U0 n8 f+ W+ O; k5 U. `3 N$ V
  145.     def list_Caterg_detail(self, response):7 y( a1 f, l/ O1 R
  146.         Cater_Name = response.save
    0 o+ m7 j; ^$ `" |: `
  147. #        print Cater_Name
    / Z# K( d5 P- @: R+ t
  148.         Bookname = response.doc('h1').text()+ o& d. x  f0 x
  149.         print Bookname
    . }5 M' W2 N- ~' m- [0 `5 x5 {
  150.         Book_author = response.doc('.authorname > a').text()# i: X* ]- D) u# ?/ a
  151. #        print Book_author
    - A) x6 Q/ A2 z! `+ ?1 P
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    2 [6 w# Z. z, N! t7 P- z/ S
  153. #        print Book_Introduction
    0 U1 m, F* e2 ~+ o
  154.         Book_Synopsis = response.doc('b').eq(1).text()2 O( x' K  |0 M5 F8 {+ H
  155. #        print Book_Synopsis
    5 {2 B2 U- W( Z
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]$ ?" T: p7 _* M, H8 J2 j9 |
  157. #        print Book_Palabras  @( h! b% V/ C' J) v+ d
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID& h/ I2 P- }% }9 Y
  159. #        print BookIDs
    * N0 J2 ^& B) \3 ?# H2 z
  160.         Book_Dates = str(datetime.datetime.now())         
    # O( @' h- a4 c; T, ~3 U  Q( d6 b, i
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    4 t. y8 m0 H& h; {% p/ g: ?
  162.             img = imgs.attr.src( S# G  O/ M% k: w
  163.             print img8 ]+ i, J) t; s- R- W+ @8 M/ M
  164.                 #小说封面下载
    ( }$ c- c& z. T% P
  165.             extension = self.getExtension(img)8 g2 Y+ d1 B* g  j/ i, t. B
  166.             name = self.getname(img)
    4 A, m$ ?7 v& q: r6 p; _! H, W8 F
  167.             file_name = name + "." + extension) K1 U- `2 Z+ h
  168.             imgDir = P_dir + name
    4 V7 q& J, H5 T6 e' {4 j& M6 d- i
  169.             Locaimg = imgDir + "/" + file_name1 V% f* r7 X9 J9 l. V' }/ \# p
  170.             print Locaimg6 a" Y' w! f5 d# U5 R- x
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    . ^) R' t- q# W$ q
  172.                 print('attachment url is ' + img)               #7 `. S4 A1 o; c- h# |& J* z
  173.             Datos = {
    / d6 O: s6 R* k) J/ L9 ~
  174.                     "Cater_Name":Cater_Name,1 H8 {/ B% {: w- B: U
  175.                     "Book_author":Book_author,* m2 t( E" ^/ i" k! d0 X
  176.                     "Book_Introduction":Book_Introduction,
    7 H5 O+ M$ F( r
  177.                     "Book_Synopsis":Book_Synopsis,
    5 t- Z, u* K  g' {
  178.                     "Book_Palabras":Book_Palabras,8 q) Q$ ~8 H% C( w' y" v
  179.                     "img":img,7 [; d( y3 e1 s( N% Z) r9 [2 ^2 [
  180.                 }4 h9 O  F3 [# B5 e) X" A8 p, |
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布- w- i4 m/ E; _  D
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():3 Z; Z1 K* A$ b( c' d0 ^
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    . [/ p8 U' G3 y+ z: d
  184.             9 E' t% F8 P' l: @9 A4 K" _
  185.     @config(age=8 * 60 * 60)   
    - K- H- I6 O+ J; v
  186.     def index_page(self, response): 7 d) H3 d! Z; H
  187.         Datos = {
    - ~( V! L8 G. d" O+ ]
  188.                   "Cater_Name":response.save['Cater_Name'],( u' J, ~; |7 D4 ~, ~( T
  189.                    "Book_author":response.save['Book_author']," {7 B8 W  Z7 r! x4 w4 I  l
  190.                    "Book_Introduction":response.save['Book_Introduction'],$ n$ o; u4 x$ J7 R% w( {- P
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    2 g3 O) j! C& }' p8 p9 i: A' u
  192.                    "Book_Palabras":response.save['Book_Palabras'],/ Q+ K' y5 Y( H$ a
  193.                    "img":response.save['img'],# U/ y  l) s6 o, |7 R# n/ H. ~+ G) p
  194.                      }
    6 _7 E* K9 o# p4 O& r
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    ! H' A' K4 M5 r( f
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    4 u! e- p6 D8 C* v* }8 J1 E
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos): c8 g, G( w. d, u$ C8 ~4 E) K
  198.     @config(priority=2)4 ~8 U9 ]* ^" K9 F. u; k
  199.     @catch_status_code_error1 {, d9 e, o; o/ }& \9 Q
  200.     def detail_page(self, response):        . q) q/ S( N, e; n# [
  201.         NewRe1 = u'哈书'2 R! f+ E) Y" h+ U
  202.         NewRe2 = u'huhjsd.CC'
    6 R, I) P1 N9 h2 S# S8 ]% F6 G) R
  203.         NewRe3 = r'^\\n\\n'+ i1 G3 ^! O3 F, H
  204.         NewRe5 = u'小说网'
    5 g" e8 A8 f; H" j
  205.         NewRe6 = u'fgdfgf'' V# ]! W, ?/ ]' `
  206.         NewRe7 = u'fgfgf'
      D  ^" C" w( Y' Y
  207.         NewRe8 = u'ffhgf'4 W6 A+ n# C* R; K! N9 M8 ]
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'' s0 z- X; g8 h& X# e4 @# r
  209.         ReC1 = u'静思'& u8 V+ o  d' Y+ v! o4 _
  210.         ReC2 = u'aghgf.com'
    + K0 ^( R4 i/ W& ]+ K% A9 G; `6 ]/ @
  211.         ReC3 = u'aghgfh.com'" B; h  O5 f. `/ M  b( O/ X
  212.         ReC4 = u''; S& L4 L) U0 h- G$ C6 V# d
  213.         ReC5 = u'文学网'
    8 I9 B4 b1 X4 ?* X2 I7 K
  214.         ReC6 = r'<BR>'2 C3 w9 }7 y$ @  ?" ]1 |' v; T
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称- f' x& ~8 x( ^' ~7 }: ]/ ]$ g& e
  216.         print Bookname8 D6 F, Q8 n& @5 [5 X/ ^9 d8 `: w
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类3 Q) h$ a3 d) f0 U; x; c
  218.         Book_author = response.save['Book_author']   #小说作者
    - @- h. a' a; x
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介( n# v, X- O# I0 {
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新1 U) [) E2 ^$ v/ L
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数9 H2 n- y: O! R0 E$ R
  222.         Bookurl = response.url   #小说网址
    6 N8 [+ ]! K/ A
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    5 ~: E& W1 h$ j
  224.         BookID = response.doc('.readset-r span').text()   #小说ID' i; x, n0 {" p$ U, F; ]: {
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容, g3 v5 N' J: A1 y
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    & `. \$ c& D8 x; R+ m
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间( k! l$ S+ u1 O1 H) a' g+ V
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)! C  C, `9 r' Z8 D/ O9 Z
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    + u9 t5 n, N* w0 C+ `" B
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)+ U1 _: d% v3 Q' l  x
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)) g! A* y; T( V" N1 S, a
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    : @$ _( L# e3 H7 V3 x* D
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)% F6 o% d! \0 c1 w4 D  ]
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)6 P! t9 z4 s4 O" @0 G
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    ! X; j( j/ x' \  F$ P% c) e
  236.         print BookConte
    " E8 ^3 N; {, l
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)4 F. G( X+ p2 P3 D3 N( r
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    & S; e- P8 O, z" k  ~0 B9 C
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    ; Q7 {  O- X. l* Z" A. d9 w9 w
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)( B: N) O! ^/ n* S) ^
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     + V4 {/ r4 c" O$ ], z6 r
  242.         Book_img = response.save['img'],  #小说图片5 A! y1 k9 \8 g9 |8 z0 H- K
  243.              ! A7 [  r0 d5 L$ g$ t
  244.         #insert into MySQL 小说入库" T, v7 B0 k+ w2 S7 y
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布' e, a( N8 a; e8 M! v
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    . X& }4 M: A3 R2 j& R+ J
  247.         #post提交发布% p! t! R1 \" P% |  L! u, }
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消* K' j3 f' C( j; e5 _8 J
  249.         Datos = {* d* M& r; G& \9 m' C1 H+ p
  250.                   "Cater_Name":response.save['Cater_Name'],
      ~2 P! t: P& W% d
  251.                    "Book_author":response.save['Book_author'],, o0 T7 W& z& l
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    ' N% Q( p9 P6 c$ A* b
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    3 J& d. o4 {9 U
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    1 T4 S4 z. Y: C6 g, c. u
  255.                    "img":response.save['img'],5 l8 W3 Y0 I* v  Z" C& h
  256.                      }3 e% N! m7 G* E! K. O7 ~
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():9 a$ w+ K8 G" g
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) 6 ]1 p9 [4 n, t" t: [# a
  259.         return {, d  X1 Z1 L3 b$ x" T, l
  260.             "Cater_Name":Cater_Name,
    % q+ C" }( t$ u/ K- b. }1 E, L- s
  261.             "Bookname":Bookname,7 ^& D( H. a6 z! }( h- |+ y  M
  262.             "Book_author":Book_author,) `0 p+ f9 H. [; ?% P0 b, b
  263.             "Book_Introduction":Book_Introduction,
    ! f% S6 ]  C8 k7 o
  264.             "Book_Synopsis":Book_Synopsis,$ q2 |, y4 h+ l. r2 p, r
  265.             "Book_Palabras":Book_Palabras,
    6 N7 \* A  F* Q0 Z* I) f
  266.             "Book_img":Book_img,
    6 o: B) |5 S) F
  267.             "Bookurl": response.url,, J' ^2 s9 c3 j* W
  268.             "Booktitle": Booktitle,- }" P1 g+ h  ^$ y$ {! n$ w0 C& s1 {) P
  269.             "BookID": BookID,
    ! }2 A0 S9 R# O1 N  V7 @# Q
  270.             "BookConte": BookConte,
    7 l5 n, Q) p8 G7 i5 i
  271.             "Titleid": Titleid,
    & P- p1 Q$ i- e' F0 J5 L
  272.             "abover":abover,# h6 Y% m/ [% k1 T" N+ z
  273. #            "Book_Date" = str(datetime.datetime.now()),
    * M$ S+ _: M3 B( x4 |
  274.         }
    * H& W# |: C) f8 p
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    ! ~$ [0 N, g1 V& g0 j% |7 j
  276.         if not os.path.exists(imgDir):
    * t  H: X  U( N) ?2 }/ _: K# k3 B
  277.             os.makedirs(imgDir)1 q) g: e) t- V/ |! q- m
  278.         file = imgDir + "/" + file_name
    ' X- _# k- m& q
  279. #        print file* z- k  L& G3 I2 i7 I- I( e
  280.         f = open(file, 'wb+')
      _1 K9 H+ l0 \6 C+ r# f5 `
  281.         imag = requests.get(Book_img) 8 T" Q2 w' h/ c" ]) d/ X
  282.         f.write(imag.content)8 p7 H. v" s* y1 N
  283.         f.close()- Z: a  c6 h( J
  284.         #保存图片前+ k5 Z- \; b! O  B. Y; v( q0 H8 N& C- @  Y
  285.     def save_imgs(self,response):
    , F; P( M. ]/ s* q. K
  286.         content = response.content
    ) l9 F0 F% A5 L+ Z: n
  287.         file_name = response.save["file_name"], L9 V! e- Y4 N# a
  288.         imgDir = response.save["imgDir"]! u( O) b! U6 t( ?
  289.         file_path = imgDir + file_name
    . @! A+ l2 r+ ~( Y' G  D
  290.         self.save_img(content,imgDir,file_path)
    # M+ T* M0 d* }
  291.     #保存图片2 x; W/ F0 |# ?! J/ I& U1 m2 U
  292.     def save_img(self,content,imgDir,path):( E1 \& P1 [0 o# i& c8 f8 V
  293.         if not os.path.exists(imgDir):                        
    5 B* u! R' P9 u3 z
  294.             os.makedirs(imgDir)" X' a# h; _6 T5 I6 u% k. z9 s
  295.         f = open(path,"wb" )
    0 C. L  V/ S: H, h( J- V
  296.         f.write(content)2 J4 q" ?' J! u
  297.         f.close()
      M' @4 D2 N' H
  298.     #获取url后缀名. C+ b; l3 C  z7 [
  299.     def getExtension(self,url):                            : h* z5 |! ~8 K, R
  300.         extension = url.split(".")[-1]0 h0 E( M% Y7 X0 S
  301.         return extension . p; m8 m' ^- `/ k' T+ Q- ?! e/ p
  302.    
    / p1 Q9 O) x: Y3 {1 y9 j$ R$ R6 J
  303.     #获取图片名# l! U" e( ]% U( k
  304.     def getname(self,url):
    ! O% ], [+ [) U
  305.         name=url.split("/")[-1].split(".")[0]( H8 q( z5 R2 Y5 m
  306.         return name
复制代码
; m; G0 d8 U( \5 w4 v: A  C

# {/ i( O: R' V  S: W
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-19 06:42

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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