找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
9 [6 U  i; V, B5 o) v4 |" u2 g
  1. #!/usr/bin/env python! t* r1 o" y( J7 d. y9 ]0 c. H
  2. # -*- encoding: utf-8 -*-: k1 C0 S4 W9 f8 Y' D# j6 Z& ^
  3. # Created on 2019-05-05 21:43:11
    # e8 {6 _! `3 F) ?( o! n3 J
  4. # Project: XiaoShuo+ Y% r% |' b! J: V) h+ {* P6 d

  5.   @( t; {0 N  F# \# a6 J2 Y4 K  x
  6. from pyspider.libs.base_handler import *
    8 C. [: L7 k. f, n' O3 o  ?7 N
  7. import pymysql. k- {: u* p8 Z. K
  8. import random
    0 i- G1 P& s8 ?# Z; A8 ~- {
  9. import datetime
    4 _8 j, {) N! g, |& K6 ]( H# S, q! G
  10. import urllib2,HTMLParser,re
    + q, T. _- K# W& W, x2 }
  11. import os7 C6 O  b# ~, s) F
  12. import sys% y: }) c/ G# V5 s) r- X4 J( y
  13. import re2 G4 R: }. v& P6 K5 J
  14. import codecs
    4 H( m6 {- o* K. T1 H/ ?
  15. import requests
    + R6 O% {) U, n' _9 \4 z
  16. import json4 F" N9 L8 R2 n, G- }$ |
  17. 9 B% L% G" G+ [- G0 q, B
  18. class Handler(BaseHandler):1 ]: k4 O" y- X6 `' c* r  ^3 r
  19.     global Datos
    ( J% p* a9 y* `6 m' G6 u
  20.     global P_dir   
    / L7 P+ }. |  k. }4 C( m4 W' z- P
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径, `! Y5 |* O8 Z( P6 ~7 n
  22.     global Datos, w9 r* b. Z, M3 {- f+ C7 N7 s
  23.     Datos = {}7 r) G7 b' A- u# i- J' T* C+ h
  24.     headers= {. H4 u+ A/ u' J  }" m1 m$ g7 _& b
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',+ d' `7 o$ N5 f6 A
  26.     'Accept-Encoding':'gzip, deflate, sdch',
      _$ A; W( \3 I7 {# y
  27.     'Accept-Language':'zh-CN,zh;q=0.8',, {( `+ L3 m# ?& _7 Y' @
  28.     'Cache-Control':'max-age=0',0 w. Q6 b- u! m& C2 l
  29.     'Connection':'keep-alive',
    3 b; |1 {0 {9 w# @- e/ 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'
    / N! r. i! K4 r0 e
  31.     }
    0 q6 w8 y& ?9 ~8 V
  32.     crawl_config = {) S4 H$ y3 `3 W% w2 r* \  r. t0 Q8 A
  33.         'headers' : headers,. D/ n' X: S6 i; m5 K
  34.         'timeout' : 300  O$ t, U$ T4 O  b, E/ f. f! z
  35.     }
    ! m' T" L; q1 B
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):6 A% a' K3 o" i: Z
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    " [+ O6 S2 ~8 e# x1 @3 A. O: n! J( S
  38.         try:2 x1 t+ ?' n, }9 [
  39.             cursor = db.cursor()- w. d- @; m$ |$ S
  40.             #注意此处字符串的占位符要加双引号"%s"
    ( K  S% z* p+ x
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);1 v5 f- M, g6 B$ L8 l6 C* ]- h
  42. #            print(sql)
    9 {9 @+ v% b' n
  43.             cursor.execute(sql)& x1 Y  y1 C4 G4 l' e0 p% q8 s# m
  44.             
    + O+ }; e% @; \' N
  45.             #qid = cursor.lastrowid
    1 x* v0 i  A" p5 B+ P1 w5 {- D# T
  46.             #print(qid), R/ x6 L/ Y. m: C
  47.             5 u6 ?/ b% Q. s8 c' k# H2 _! y
  48.             db.commit(). L& T2 ]0 u) [- K  h! }1 C# m
  49.         except Exception as err:
    ( g9 ~  k9 Y/ [! n6 A& D0 i
  50.             print("Error %s for execute sql: %s" % (err, sql)): x  K5 L8 d; o* A- \8 X& h
  51.             db.rollback()
    - v+ T) {+ E4 o  G1 x' A& B7 \0 z2 d
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    . e1 h" R& I" K, j
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    % V2 R4 f: y6 S" W
  54.         try:
    : G: h) P/ s4 b4 Y; t( \9 b* p. L1 Z# I
  55.             cursor = db.cursor()7 ?; j, ]7 @' |! w) _5 m
  56.             #注意此处字符串的占位符要加双引号"%s"/ Z' D9 o; J0 a% m
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);; H( `5 C5 M4 @) z; X; V8 d
  58. #            print(sql)
    8 R, j$ g7 T! F7 U( z0 m
  59.             cursor.execute(sql)
    ; v( D% }( G& F% N- M
  60.             0 e# P0 m; S8 l6 Y* f. T
  61.             #qid = cursor.lastrowid  F, U2 E4 f" u. ~9 _" o
  62.             #print(qid)
    . R- M3 Z  I9 x7 r; n* V& `9 }! W
  63.             3 V+ Z0 j5 j* s7 _
  64.             db.commit()  r. F, Y0 j+ `
  65.         except Exception as err:+ h  X+ y  J0 x% d  ~. t: T+ M' C* B
  66.             print("Error %s for execute sql: %s" % (err, sql))
    # x7 o5 d; c3 N  w0 |8 q# L
  67.             db.rollback(): g9 l' h! V& n7 Q3 Y+ Z' {
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):8 @7 `5 g* D- K6 P
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    . g! p8 J& ]$ v9 s0 G7 {3 t
  70.         try:
    $ l* O# O) }6 F
  71.             cursor = db.cursor()
    $ O! v+ [, |: W9 }' I
  72.             #注意此处字符串的占位符要加双引号"%s"
    + }9 W) s) \5 V9 w& |: }
  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);- U% O" Y! }" U6 e  f3 I
  74.             print(sql)- H1 B( t+ E7 z& p; ]  ?
  75.             cursor.execute(sql)
    2 |+ Q2 V0 l5 X: B) s  g4 c6 b
  76.             print(cursor.lastrowid)
    , P7 r2 x( U- n8 Y2 e
  77.             db.commit()
    3 ]1 t. ^: J# s4 a
  78.         except Exception as err:' Y4 U+ l! \0 f  G3 b
  79. #        except:* j2 y  J( p; [0 p! B
  80. #            print('Failed')( d+ |  G$ e( x- V  P
  81.             print("Error %s for execute sql: %s" % (err, sql))
    % }2 g: j/ Z, k6 E3 P7 `- m! M4 `
  82.             db.rollback()$ W: P8 \8 H& a
  83.         6 {5 O: b$ _' \5 X' G
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): 9 |! `) i9 M! E1 n; k
  85.             reload(sys)4 o$ L& K& j% t( g3 B5 p
  86.             sys.setdefaultencoding("gbk"): H! C+ u2 U9 X2 F
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址' M4 U5 m+ F0 R
  88.             locoy_data = {
    . n* L% d( s% ?$ T
  89.             'my_u':'用户名',   #后台用户名4 C/ _* O$ b% c
  90.             'my_p':'密码',   #后台密码0 |& Z: g' O; C# Q* @
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    " |6 x% y4 g' F2 ]6 {1 }
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    $ O* Z) K+ r/ h+ [( n
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),1 }) o! Q7 d8 I' d$ ?- N4 E
  94.             'article':BookConte.encode('gbk', 'ignore'),
    ; }: A6 q; F& W  x- J
  95.             'author':Book_author.encode('gbk', 'ignore'),
    % S) v' k1 v8 W% F: N
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),+ l. m* h8 |1 W) o
  97.             'thumb':Book_img,
    * N$ k1 n$ M% L
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),2 ~' r$ y  y8 J/ E7 L$ A4 h
  99.             'abover':abover.encode('gbk', 'ignore')           
    5 y' U3 X  N7 Z$ l
  100.                 }
    % t5 F) @' M. x+ y6 _' y
  101.             res = requests.post(locoy_url, data=locoy_data)1 s& g$ ^+ N5 i1 g+ D* {
  102.             print res.text
    " |, @1 w7 c+ ?0 l. S7 ^9 W
  103.             print res.content3 f. O" _8 Q' n/ f
  104. #            print Dsd
    ) M: _( Y: H5 U! I9 M$ L! X+ X& B& o& ]
  105.             return res' X, A4 W& V/ Z9 P1 }% M
  106.     / _+ t. [2 z2 N# G! B
  107.     def __init__(self):: T) T; G, Z6 N  s- K
  108.         self.base_url1 = 'https://www.****.cc/'* ^6 Z9 V9 d( ?- \
  109.         self.base_url2 = '/'4 J1 U: d4 X- a/ t0 O  N" x5 J& H8 w
  110.         self.CaterId = []) C; R% w# m8 t% S" G! h; F6 C, i# S
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']; i' {& f: J* O" y
  112.         self.page_num = 17 ^7 o  s- Q" p# |+ L8 U
  113.         self.total_num = 200   ' T! x  C# r7 x# l+ j9 R

  114. ( U8 n6 K& N$ I/ k# n) Y
  115.     @every(minutes=8 * 60)
      t/ j4 T; f1 q( m4 _+ i; f# w
  116.     def on_start(self):
    $ V9 i$ g: l/ B3 q
  117.         global Cater_Name4 @$ P, Y  J3 e( i
  118.         Cater_Name = []+ ^) j% f5 ~& A& R' [& S
  119.         while self.page_num <= self.total_num:
    ; I& t7 C& Q4 _4 S" q5 c
  120.             for self.CaterId in self.CaterIds:
    # x- U" a5 A/ e
  121.                 if self.CaterId  == 'xuanhuan':0 ~2 G/ T$ j; S2 @; x; V7 d$ x- h
  122.                      Cater_Name = '玄幻'& }9 G! a7 f! d' f4 Y
  123.                 if self.CaterId  == 'wuxia':8 a$ h% X7 i5 ?  r
  124.                     Cater_Name = '武侠'
    ( U4 E6 o. G" m; H
  125.                 if self.CaterId  == 'lishi':# B* v5 l; w# |$ t  p, @/ `
  126.                     Cater_Name = '历史'            - f- G! p1 t+ z& \, g* v6 ^
  127.                 if self.CaterId  == 'yanqing':  e, [5 L- h! s
  128.                     Cater_Name = '都市'
    0 f1 r1 C4 u- T! i
  129.                 if self.CaterId  == 'nvsheng':
    / a$ ^7 i) m4 D! s+ ?. D3 c
  130.                     Cater_Name = '都市'
    ) t) J; Y; H: l2 E' ?2 b: {
  131.                 if self.CaterId  == 'kehuan':
    0 O! B: i+ q5 Y( C4 x+ z' U4 k
  132.                     Cater_Name = '科幻' 6 x, ?$ X' P. v- s4 b
  133.                 if self.CaterId  == 'kongbu':
    8 z3 ^' D; ?4 s
  134.                     Cater_Name = '游戏'
    - T4 Q/ K+ o7 n7 q% A2 A8 R, `
  135.                 print self.CaterId0 D0 ?( k' O4 F! T" `% I9 i0 X
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    8 m+ ~5 V( [) E6 r- s
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)) W+ p: S# R% F  h
  138.             self.page_num += 1
    ( Q. Q/ v1 J% L# n8 z: z
  139.             
    . h" _* X8 }( h
  140.     def list_Caterg(self, response):" M; D# H& N/ B9 f% q2 Z
  141.         Cater_Name = response.save
    , ?8 q/ w+ ?& a3 X1 L
  142.         for each in response.doc('.pic-list a[href^="http"]').items():$ y5 I8 E4 D! a' j
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    % f- o( Q5 h' ?3 B$ N: B
  144.             
    ! v* k% Z' K# Q2 K( d: }/ |* N
  145.     def list_Caterg_detail(self, response):
    - w3 w! `3 B% W) U2 r
  146.         Cater_Name = response.save3 y) q) L* a: K0 ]
  147. #        print Cater_Name/ e: I1 E" v" @$ H- l  S4 d
  148.         Bookname = response.doc('h1').text(), s' i. f* G9 {' _9 y( W1 c
  149.         print Bookname+ _# ?$ N! z9 P9 Q( S/ l
  150.         Book_author = response.doc('.authorname > a').text()
    ) J- X' w/ Z3 q+ E
  151. #        print Book_author$ ~; t, i3 S! l8 `
  152.         Book_Introduction = response.doc('.book-intro > div').text()) Q+ T8 L, E1 A& c
  153. #        print Book_Introduction# B- U2 l3 |% g( W6 g$ c
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    + A/ c7 T3 V" A8 ]) ^/ c- P
  155. #        print Book_Synopsis
    ' T- T5 `# a* m8 C, w
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]$ S; p# D  F7 c/ C
  157. #        print Book_Palabras; S- Y% t4 Y' a. @3 S% X- n
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    : k/ I# V9 R6 P* V
  159. #        print BookIDs- ~% o0 n7 _) \$ P/ L, G
  160.         Book_Dates = str(datetime.datetime.now())         # J/ ~3 e9 Q1 b1 o% P% A7 k
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():7 a" [1 W5 H6 u8 e* \+ C+ ]
  162.             img = imgs.attr.src4 I% e/ z/ Q* [) A# L7 B5 f
  163.             print img' L$ B7 J0 l5 J, X% U4 `0 a
  164.                 #小说封面下载( S4 R7 Q. b& {. i5 |
  165.             extension = self.getExtension(img)
    & ~7 M* }" M0 I/ `
  166.             name = self.getname(img)
    % P9 [8 w( h+ g
  167.             file_name = name + "." + extension
    0 m* ~+ @0 ?# t2 q
  168.             imgDir = P_dir + name- b& N6 e2 }+ {+ Z4 _3 f/ X. N
  169.             Locaimg = imgDir + "/" + file_name
    % O9 w- }/ O8 ~" z8 Q$ H
  170.             print Locaimg; r' M+ q" ]% J
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    * G; @' I! s# L' P5 j4 F3 L8 e
  172.                 print('attachment url is ' + img)               #
    0 }5 _4 V& u3 U& Q( B
  173.             Datos = {
    4 d" \" I% S  ]( N& c
  174.                     "Cater_Name":Cater_Name,5 i6 o% X  R/ r1 V% R
  175.                     "Book_author":Book_author,
    : _/ N. u  V) n8 u7 `1 ~
  176.                     "Book_Introduction":Book_Introduction,
    * T' [  {0 q( r" W& ~! v* Z
  177.                     "Book_Synopsis":Book_Synopsis,6 J! c9 u' I/ P( U/ g; t- q
  178.                     "Book_Palabras":Book_Palabras,
    8 n# d6 @% K$ \5 i6 l  a1 N
  179.                     "img":img,9 g& G  G1 l5 m/ I0 ~+ j- b
  180.                 }
    . T9 V. R% C7 X; c! X2 ~
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布8 d# \/ E2 I& T/ P& O, O
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    * m4 o) o0 D2 L- C
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    # s* F* |. G$ ~7 i3 N' _6 q
  184.             6 t4 n9 W6 x6 i8 M; o8 I3 Q+ A
  185.     @config(age=8 * 60 * 60)   
    % r+ g2 ?; N4 [; R
  186.     def index_page(self, response): * u/ s; R/ f+ [6 e# ?2 `
  187.         Datos = {) t; C7 n3 Z7 K+ c  F/ C; j, ]
  188.                   "Cater_Name":response.save['Cater_Name'],* G, x- D6 H1 H8 d+ L9 t5 Z1 o  @6 l
  189.                    "Book_author":response.save['Book_author'],
    ! u% s' u  v6 z: k% b! s: |5 R; ?& F
  190.                    "Book_Introduction":response.save['Book_Introduction'],9 a$ ~8 ~6 X4 ?- o8 W
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],# A9 S7 u1 Z" @& A2 i9 C/ x% y
  192.                    "Book_Palabras":response.save['Book_Palabras'],$ `2 h6 K) H6 E0 Y" _  v; T  ?8 k
  193.                    "img":response.save['img'],
    : l9 g8 @1 b8 W, {
  194.                      }& g# N2 j( I( c  [( `7 B/ s$ J
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    " Y* o; B) w/ m# i% |- J
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  0 y& o. p$ }7 R, H
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)" t& j8 u) `' r6 X
  198.     @config(priority=2)
    8 @4 f* k5 n: Y3 c1 e
  199.     @catch_status_code_error$ R( D( V: c( I2 H, i9 d
  200.     def detail_page(self, response):        % m5 J" B+ b9 X( H
  201.         NewRe1 = u'哈书'
    0 A+ P' B3 A  ~# e* T# G
  202.         NewRe2 = u'huhjsd.CC'/ P- o+ W- [/ b) Z
  203.         NewRe3 = r'^\\n\\n'2 H+ C/ N* l7 f* L1 w2 H* X
  204.         NewRe5 = u'小说网'
    , D; k6 ^9 h+ R
  205.         NewRe6 = u'fgdfgf'
    $ U" I; O/ [; O$ E
  206.         NewRe7 = u'fgfgf'
    & u" d' [4 x$ }' z6 `
  207.         NewRe8 = u'ffhgf'; |2 n" v% p& r; J
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+': U" U( z, }" V+ h1 Q/ p+ @
  209.         ReC1 = u'静思'
    0 E* o3 u  w( i3 ?' v
  210.         ReC2 = u'aghgf.com'
    3 ]1 D3 R# I) q4 q: [
  211.         ReC3 = u'aghgfh.com'9 B$ V% A! T6 d3 l1 I
  212.         ReC4 = u''
    4 q: N0 ^$ S  g/ t
  213.         ReC5 = u'文学网'3 Z5 m' @6 A! {: p" m# Z& l# {
  214.         ReC6 = r'<BR>'% K# q" `& w. U6 D9 y" U+ w
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    ' s& B) k! H" ~! {: ?
  216.         print Bookname. ?  T% A" N5 |* ?  X( v
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类4 }2 I7 v4 F7 {' ~3 ]# G
  218.         Book_author = response.save['Book_author']   #小说作者; P# N7 e2 C& z0 V' I% Q9 G
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介0 c7 h6 s1 u& @1 f, {
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新1 a! g) k9 w8 u" ]* ?
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    9 ^" j6 c4 X! s' a) \$ I9 S0 ]2 ?
  222.         Bookurl = response.url   #小说网址: }5 \$ k5 n( H( K+ H/ n! t
  223.         Booktitle = response.doc('.article-title').text()   #章节名称* k8 r$ E6 ~8 e! t2 H4 j# j
  224.         BookID = response.doc('.readset-r span').text()   #小说ID8 t+ S1 ~2 J8 R0 C8 v- [
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容" u% y" n1 k+ @4 f+ h
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    2 X& }! i  d; r* U7 p0 @5 N+ @
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    5 W" q) O5 q2 ]' Z2 J- b) M5 e: R
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)! A* B; L& Q+ s3 m
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)7 a! |# W' }7 c9 T1 I7 `
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    , Z0 @2 l1 ~7 K1 m0 ?5 k; I
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)7 I& c9 s; Z0 W# M6 d0 ?( s; M* p4 h
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)* l# r  |- R9 k2 p$ V9 d& E
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6): F7 c" u+ }* |( }: O3 P3 o
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    : f: i; B" n. y, f1 L. G
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    % z3 v" M  c* m+ `, M3 K( O
  236.         print BookConte; I9 V% K. K% X/ Z, j" R* A
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    - Y4 ?5 U7 I. ]9 _5 w; I
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    7 P1 W+ F6 J( n8 g+ q8 k. p
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    7 o5 I* ^; G7 M: Y6 J
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)3 S, _( }( {) O7 ^8 {, H
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     - v1 U& ^: B* n( ~0 E; |& _& Y
  242.         Book_img = response.save['img'],  #小说图片
    & Q/ ~4 I7 V# a/ T" ^+ U3 E+ T
  243.             
    2 a3 y( P) r# }" R: N7 e% _1 u
  244.         #insert into MySQL 小说入库. [- e# C# q: _6 J+ ?! R
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    ' X8 X, H" U$ Q
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    ( M2 @3 i* z/ q
  247.         #post提交发布! k7 v' a$ b* c2 L
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消4 z+ W' k' |5 L* A& F
  249.         Datos = {
    $ o6 W# n0 O* }8 }
  250.                   "Cater_Name":response.save['Cater_Name'],
    5 ?3 a; y4 ]! h; F! `
  251.                    "Book_author":response.save['Book_author'],+ E/ w9 K6 s! K3 D& |& g
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    3 @  z# H5 t5 Q6 N6 L0 l" J' z- o' P
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],. D0 Y5 L8 d  s
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    & ~: p: Z% v' a2 D, c% p: _7 d
  255.                    "img":response.save['img'],
    . v3 p$ y9 \& `3 n
  256.                      }' {% e6 H/ i7 ]0 d$ x$ b
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    ( m& I( ~" r8 o, Y7 J' s0 q
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    2 D( y: M) w, }6 E  H: W
  259.         return {, I. M- r8 V" \/ `& Y0 e
  260.             "Cater_Name":Cater_Name,
    % A8 @2 V% v8 q( W4 T
  261.             "Bookname":Bookname,
    * j/ p* s. R, ~9 f% o1 y1 o6 P5 V
  262.             "Book_author":Book_author,' h9 M9 S, i+ o
  263.             "Book_Introduction":Book_Introduction,9 f7 |. Q# ]( V* j2 g8 R
  264.             "Book_Synopsis":Book_Synopsis,
    7 t! r' v# p0 U8 n! p4 _* w
  265.             "Book_Palabras":Book_Palabras,
    : z* c( f+ }+ H3 `. m- I: i
  266.             "Book_img":Book_img,  ]5 j* I& C4 I+ N
  267.             "Bookurl": response.url,8 U% p" X6 W6 d/ J; {* @& p0 G
  268.             "Booktitle": Booktitle,
    + q/ y  g- ~6 b
  269.             "BookID": BookID,
    ) H9 B! R, t% y, a9 n. M
  270.             "BookConte": BookConte,% {; e, m6 m! ^, b2 K) _  `
  271.             "Titleid": Titleid,
    & d0 ]; t6 L5 R4 {
  272.             "abover":abover,
    5 U, f* L. U. G! \/ ^5 R
  273. #            "Book_Date" = str(datetime.datetime.now()),
    ' j  Y0 i. {: G3 n
  274.         }7 _- g  ^/ H: K
  275.     def download(self, P_dir, imgDir, file_name, Book_img):: I. Y" \* ?# Z! }
  276.         if not os.path.exists(imgDir): : ?4 V1 ^% g/ o8 z# u
  277.             os.makedirs(imgDir)2 W$ R! A+ N: s9 {& ?0 s9 K3 ^0 `
  278.         file = imgDir + "/" + file_name
    - G) v9 O+ C$ D6 E
  279. #        print file
    0 l" `! D3 p& u* ]  K
  280.         f = open(file, 'wb+')
    / E% U  c$ Y  h+ W6 X8 Z3 r/ G+ x
  281.         imag = requests.get(Book_img) 6 a# o6 O2 ]" ?; f6 h* U4 K
  282.         f.write(imag.content)1 F! q3 y( v8 a$ g6 m* d
  283.         f.close()
    ' G# g. n- X, r
  284.         #保存图片前
    - j2 j7 X# c0 g5 F
  285.     def save_imgs(self,response):9 }; V% z, r& E2 Z
  286.         content = response.content& c4 J" w2 u8 y1 w9 G& t" O2 J, z( j( _
  287.         file_name = response.save["file_name"]  Z( ]8 t3 x$ p+ Y- x) ~
  288.         imgDir = response.save["imgDir"]- j: }0 @# c! A
  289.         file_path = imgDir + file_name/ ]- O2 l6 t5 Q$ d
  290.         self.save_img(content,imgDir,file_path)
    ! d# h: a- u2 I* ^" d+ g
  291.     #保存图片
    % i& @  T* M- B5 f+ L) t6 }
  292.     def save_img(self,content,imgDir,path):
    + e  e9 `9 F  `* o
  293.         if not os.path.exists(imgDir):                        
    3 `* a3 W* i9 }
  294.             os.makedirs(imgDir); j4 t) l6 H2 x+ p7 r
  295.         f = open(path,"wb" )3 l/ k$ R8 F0 J" T6 `  K8 I+ k
  296.         f.write(content)5 O7 N" P; B6 f% `3 l$ A" [1 m
  297.         f.close()
    6 f' M" W2 q2 r5 _2 p
  298.     #获取url后缀名& E4 c  X! S7 s$ {' i% ^" w3 k
  299.     def getExtension(self,url):                           
    5 c- J" k& p! [* h
  300.         extension = url.split(".")[-1]+ h$ ?# m+ C0 A+ c# V/ e% Z$ b' x
  301.         return extension
    : n( b4 e$ [+ A8 c, }, G4 s  J' I
  302.     ; ]) d* a3 g1 J( ^0 ^' x
  303.     #获取图片名
    ; B3 F3 M7 ], R+ w: u. o9 a
  304.     def getname(self,url):7 {" U4 U% B  L% W
  305.         name=url.split("/")[-1].split(".")[0]
    - _. Z6 F6 k. E- Z( @* N# V
  306.         return name
复制代码
& `. ~6 {( ^8 H6 p7 ?, `
- }" A$ g8 U4 ~4 F
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-1 12:41

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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