找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!2 _7 O$ {/ k3 j1 G6 K
  1. #!/usr/bin/env python; S) t: F6 ]6 P: Q; a
  2. # -*- encoding: utf-8 -*-$ _5 b) o: N: f/ P: ~0 P$ N
  3. # Created on 2019-05-05 21:43:11
    5 S4 {1 y4 J4 X+ @0 t
  4. # Project: XiaoShuo& U2 W$ f9 Z: l0 b* H
  5. ' w( T1 Q& Q8 ^: I
  6. from pyspider.libs.base_handler import *
    0 Z! \* I# q$ j. j. L. \3 F# K. f5 P
  7. import pymysql
    $ ~6 @9 Q# F+ L& _3 A/ `
  8. import random) p# I, |- I$ o
  9. import datetime
    7 c7 r2 F: x: @
  10. import urllib2,HTMLParser,re: D& }$ ]* ]" }0 J( O
  11. import os
    & H$ I9 `" B% z; L2 [
  12. import sys; q1 e* N7 @6 Q+ |
  13. import re7 k* f6 L' B2 g# V% s) ^1 O
  14. import codecs& e8 s/ H( Z% M; A/ i) e
  15. import requests
    5 i2 |  z8 o3 I. t! C
  16. import json, z+ I( H8 ^( S9 U7 `
  17. / H5 T' F! I, g7 w0 H; j6 X
  18. class Handler(BaseHandler):% t# b* d0 s0 w# y8 t" E3 S, L8 @
  19.     global Datos
    : y1 p( z- m4 I- n5 E& P0 M& c
  20.     global P_dir   
    , V3 I1 j8 p4 i4 D4 X+ s
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径: B, @* e6 n% j' x8 N. y
  22.     global Datos8 v8 H2 k, R/ y& H; a# d) S
  23.     Datos = {}
    6 F5 f& ?+ b: d+ c  u
  24.     headers= {1 A+ k  L  b& q$ A
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',2 X' Q" M! d( J5 I. E  n8 x
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    8 g4 j. t$ D" ~; I, [- I
  27.     'Accept-Language':'zh-CN,zh;q=0.8',* c6 X. g5 S+ [! f: y6 n9 k
  28.     'Cache-Control':'max-age=0',  D" g* Q$ \  C1 k! Z/ k+ H9 n
  29.     'Connection':'keep-alive',
    / t0 F$ P6 }$ f2 F$ W$ V
  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 p+ q$ n& Q) a# }6 t, t% x
  31.     }# K/ D/ s1 N; ?$ h
  32.     crawl_config = {7 Y# N. {3 r/ p3 C. `9 e1 c
  33.         'headers' : headers,
    " R) A- [, F: G2 S4 o
  34.         'timeout' : 3001 Z& `# K/ h8 L4 a
  35.     }
    2 z  ]% a2 a! K6 D/ ~- \
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):7 m  M' D, u% Y
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ; T5 _" W  X0 j  O2 _
  38.         try:
    1 G3 X" @% {7 h* m% }
  39.             cursor = db.cursor()* w3 n2 K" q' [4 J
  40.             #注意此处字符串的占位符要加双引号"%s"0 @& H, V0 @" B0 q; C5 M
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    ) }: V$ q; a( t0 G% ]3 Z( q4 V
  42. #            print(sql)
    7 f6 ]6 I" E$ \6 y* H0 U
  43.             cursor.execute(sql)
    2 g* A0 j+ f1 N" I: v
  44.             ; x7 l) V8 d0 l8 V: @) |" r
  45.             #qid = cursor.lastrowid
    5 g$ \& r' |9 [$ U4 i2 U1 i
  46.             #print(qid)
    3 a+ s8 g5 o( h6 R: B3 ~4 A  F; m
  47.             
    . v+ n% c; d7 T" d) h6 h
  48.             db.commit()
    & z# u5 r( I* ?) Q, ?3 _
  49.         except Exception as err:, H. f/ s4 f. x; h8 K& S
  50.             print("Error %s for execute sql: %s" % (err, sql))$ ?$ C' x( j- p* Y* A
  51.             db.rollback()
    ; _& c/ k) C$ ~* Q1 M4 l* d
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):) L0 L, C; s$ _8 N  |
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    & l0 b6 S! b5 n* q8 Z
  54.         try:
    . `$ H0 _. Q% s) b' v
  55.             cursor = db.cursor()
    3 l( o/ }4 S( i0 C4 S' Y: \6 u! E
  56.             #注意此处字符串的占位符要加双引号"%s"
    ) \2 Z6 I; ^- M! V
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);8 s$ v2 U& {! n- i$ R
  58. #            print(sql)8 ]! y( ]5 b1 d. X
  59.             cursor.execute(sql)# Z! d. \  Y& m! B
  60.             
    " ~* D, e, R! N" P  K
  61.             #qid = cursor.lastrowid
    : m$ g: n0 Q3 ^/ b3 E7 j  V+ X9 l
  62.             #print(qid)9 }( X+ U, D; P% {' ?0 |
  63.             
    0 P$ B% Z4 n) b: R1 s7 Z
  64.             db.commit()
    % e9 x2 z8 H! R* W. [% y  G
  65.         except Exception as err:
    ! N2 ]4 @# A( o) K; O) r
  66.             print("Error %s for execute sql: %s" % (err, sql))8 }8 Y& D1 @4 r2 G9 m
  67.             db.rollback()$ d0 ^7 w8 X0 i8 v2 i# Q. D* x
  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 N- G6 Y" Y% R' S7 U
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")2 B+ d: S2 B- T# Z
  70.         try:
    3 b. m0 ^$ @$ g( x9 {
  71.             cursor = db.cursor()
    8 V1 u- Q- S4 E3 |
  72.             #注意此处字符串的占位符要加双引号"%s"
    $ P" R+ Q- f! [: C) X5 m
  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);
    4 Q" \7 U' t& ?( t6 o6 r
  74.             print(sql)
    3 c/ n2 k4 ~  ^5 O1 N; h
  75.             cursor.execute(sql)5 |, k! w+ ?/ ^3 u. j0 _
  76.             print(cursor.lastrowid)7 y0 |% e0 `' g. U: I  i3 Z" h4 F% c
  77.             db.commit()
    # x- y( j- C2 {0 R$ w( s
  78.         except Exception as err:
    / G  t8 G0 L; u% I
  79. #        except:
    ( a1 A- ]2 M# ~! a+ `% p+ y: V( j  b( ~
  80. #            print('Failed')! a- E& ^3 [1 v
  81.             print("Error %s for execute sql: %s" % (err, sql))  X* I$ b3 T/ M" E. B) A/ M5 G
  82.             db.rollback()! [- o2 U1 K% v+ {5 _) D. U9 B! k1 V
  83.         
    9 L. [1 O) E4 s3 e; r" x) z
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    5 n0 n0 s' F. y  }, Y2 X7 N
  85.             reload(sys)
    6 Q  w# Q( d- S! ~% T. E
  86.             sys.setdefaultencoding("gbk")
    4 \& I" i2 O- G: E; B9 w
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    . z# j! A  C6 G
  88.             locoy_data = {( n+ C1 D8 H# Z( J. A
  89.             'my_u':'用户名',   #后台用户名1 {8 Z- B' ]( y; r/ d
  90.             'my_p':'密码',   #后台密码) T- y9 t' b8 V3 }& Y% s$ k/ k
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),/ B2 t, @& n, d; w# A1 J4 `4 X+ Y
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    ( U9 m7 l% o2 O4 n# ]( ]$ p
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    ( J; k& G- P/ r) M: N3 _: }5 V
  94.             'article':BookConte.encode('gbk', 'ignore'),
    ; ~* F' u/ W& t9 }( T' I8 _/ i0 `+ `
  95.             'author':Book_author.encode('gbk', 'ignore'),
    2 p+ Q5 Q+ m4 i, R
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    3 t+ e! Y3 `: G' e. {7 i) u; r# z
  97.             'thumb':Book_img,% h' w+ n+ w8 {/ G1 \6 d
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
      {6 G. v9 T  _
  99.             'abover':abover.encode('gbk', 'ignore')           
    - X2 ]7 e5 V. i4 Q$ {( f
  100.                 }: S7 r7 s2 i; s* }( e
  101.             res = requests.post(locoy_url, data=locoy_data)
    4 s, p8 ~8 T+ {2 E6 I
  102.             print res.text) e5 X  K' O1 o) l
  103.             print res.content- K6 n4 v6 g( }) T
  104. #            print Dsd
    1 N! H, h: B0 P& D5 h1 J6 R
  105.             return res: N3 M, x) d3 `3 m& }, P
  106.     - e" ~; B0 d& ~+ _* j* I
  107.     def __init__(self):
    4 S8 b& X+ c' p+ u+ C5 }
  108.         self.base_url1 = 'https://www.****.cc/'2 z4 Y/ f% B5 g7 l) z# J
  109.         self.base_url2 = '/'
    3 ]( w2 _, w# l% {/ A8 v
  110.         self.CaterId = [], T8 Z* k1 |  D( N+ I8 d5 R  Q' ^
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    . x, w/ R5 E+ N
  112.         self.page_num = 1) X" A/ V1 |( Z* ~* ~4 Y
  113.         self.total_num = 200   $ v' E4 D" D. q# I, b
  114. # x* g: J# N# O% [' {
  115.     @every(minutes=8 * 60)% r! s9 T/ ?" L; D7 U
  116.     def on_start(self):
    3 L4 H! p, v5 L! p- [' t7 f. k
  117.         global Cater_Name9 i0 M" n) u1 E4 ]+ E$ A( D; [
  118.         Cater_Name = []" r0 j9 ~) f5 R3 t% B
  119.         while self.page_num <= self.total_num:
      Z5 O6 B' Q7 l7 D; f. s; Y1 \
  120.             for self.CaterId in self.CaterIds:
    & l! |/ y- i) I5 B7 N
  121.                 if self.CaterId  == 'xuanhuan':
    * @: Y! Z3 K6 r! P$ Y% K8 Q" z
  122.                      Cater_Name = '玄幻'0 B' G3 W0 W$ `% d, q, E2 p
  123.                 if self.CaterId  == 'wuxia':7 m. W. ^; C& D+ C2 `$ s
  124.                     Cater_Name = '武侠', b$ s7 M: ?$ H9 n$ z" l- o
  125.                 if self.CaterId  == 'lishi':$ ^( h5 C9 |6 r" H
  126.                     Cater_Name = '历史'            3 ^7 X" o7 _6 @3 v  z, u+ p
  127.                 if self.CaterId  == 'yanqing':
    ( ]; i" a) \* y5 e  |1 U0 H1 q( D
  128.                     Cater_Name = '都市'
    6 W. M0 `8 _) J* r, ^3 I& V
  129.                 if self.CaterId  == 'nvsheng':" U' E1 @) p% J. b2 W) I
  130.                     Cater_Name = '都市' 1 K7 c& t% J. H1 l
  131.                 if self.CaterId  == 'kehuan':
    2 s' y, E1 p# C) q8 V) X6 T+ E
  132.                     Cater_Name = '科幻'
    + Z) j: z% a/ x# W% i
  133.                 if self.CaterId  == 'kongbu':
    ; h: T# s  Z1 E$ W. f4 |
  134.                     Cater_Name = '游戏' 0 k! i8 _5 f% }- l3 v8 T/ s
  135.                 print self.CaterId5 U( u; t/ Z& S  L2 |) ~+ X& h
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          9 x; p7 L5 Z9 @0 o
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)6 `0 a: v1 N/ }% t! v( H4 C
  138.             self.page_num += 1 ' r3 q; Q  \2 N1 U3 z" [
  139.             / d/ `# {% n" d- N8 C
  140.     def list_Caterg(self, response):
    1 v1 G5 [* w* ]
  141.         Cater_Name = response.save
    4 ?+ ?: Q( [) h
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    4 F) |5 k. f  r7 h6 ?
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)7 C$ f: A: r0 f5 S9 |% v' a
  144.             7 S3 H% ^/ o2 h
  145.     def list_Caterg_detail(self, response):
    ! e! L" g, }7 Z. l9 a
  146.         Cater_Name = response.save& Z( \2 b: n% _  B1 M
  147. #        print Cater_Name
    0 U1 y: D, N/ v( S* q* V
  148.         Bookname = response.doc('h1').text()8 z+ X) F2 o- s$ v$ U1 j
  149.         print Bookname
      V) R' y9 R, t& Y
  150.         Book_author = response.doc('.authorname > a').text()
    7 w5 z# L7 w/ F* h) j2 ~6 m8 t
  151. #        print Book_author
    7 i" O4 a( \: O1 C! m6 r- G- ]0 t
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    & P2 h: n/ b% e% o, }: o2 N$ i: M
  153. #        print Book_Introduction: L) `3 P2 a" f
  154.         Book_Synopsis = response.doc('b').eq(1).text()4 H$ y% I+ M% M$ Y9 b: C/ I4 h0 M
  155. #        print Book_Synopsis$ u$ ?- }# b8 d# M8 ^1 d0 r
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    $ d$ ^) T' u, t! J$ i
  157. #        print Book_Palabras
    3 g7 E7 z- d: n- `0 Q% ~. O
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    . L. N0 D) E/ _. o
  159. #        print BookIDs
    8 W" z/ w/ E- J- W
  160.         Book_Dates = str(datetime.datetime.now())         9 \) t( n4 B# T- u' J. J. R
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():1 z- p( V8 `3 r; v
  162.             img = imgs.attr.src$ e3 m: ?; k$ [+ W
  163.             print img
    ' G$ W1 \, ^  ?9 m
  164.                 #小说封面下载
    % C/ e! d; ^2 N9 ^/ q: C# L0 n
  165.             extension = self.getExtension(img)( b; _; ~3 Q& A* C. @9 g' D
  166.             name = self.getname(img): x8 o/ g* H5 J' G% }2 p" \* B! u; c
  167.             file_name = name + "." + extension- D% }6 a; q9 h$ g
  168.             imgDir = P_dir + name
    7 Y1 m0 V, N- G2 _8 V
  169.             Locaimg = imgDir + "/" + file_name
    7 Q6 Z. X% O4 @$ k  z6 Y. S
  170.             print Locaimg
    / [* ~2 M" h+ w$ m& e- |7 n, Y
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地' T! [8 k( O- g: }' v) I
  172.                 print('attachment url is ' + img)               #
    2 e( {( K  n* y$ s% K* Q7 Y
  173.             Datos = {
    : d0 t3 \6 W/ k. Z
  174.                     "Cater_Name":Cater_Name,
    * |6 Z7 x; C4 ?* g$ Y+ s
  175.                     "Book_author":Book_author,& J5 l6 X! v: Y9 H$ n
  176.                     "Book_Introduction":Book_Introduction,
    ' |" k+ r4 L* v' v" Y
  177.                     "Book_Synopsis":Book_Synopsis,1 B; R3 w" l) F1 x. P
  178.                     "Book_Palabras":Book_Palabras,
    * j( B1 V* e+ U7 q; b$ v
  179.                     "img":img,7 _9 E/ Z" Q. N/ j
  180.                 }& F) v, \9 u6 K; ~/ U
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布/ q$ {; C, x; u8 X2 s
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    & m4 R+ R0 e# j5 M* A* F6 m
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    , I0 O9 E+ \; e; n5 w, ^
  184.             ! J' a9 ~8 y* t
  185.     @config(age=8 * 60 * 60)    3 M. V9 F( [! A) G
  186.     def index_page(self, response):
    & ~3 y) x3 L' m
  187.         Datos = {9 C0 I/ m# ~1 S- `( R$ k* S' ?! ^. U( c
  188.                   "Cater_Name":response.save['Cater_Name'],* @2 J! W) O; R
  189.                    "Book_author":response.save['Book_author'],
    9 b8 p2 e- A  G
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    * l- X" q( a# Z
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],  x3 P$ V, X  n; T$ q
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    ; d' m7 Y3 x) I- b0 l: P: T
  193.                    "img":response.save['img'],
    + {; F: Y4 q; {! x9 |
  194.                      }) S4 |7 c3 D: P. U* B  m
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():8 q/ n/ ^1 ^; T- X" C& T
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  ' t0 ^- n9 d) y% t; ~) {
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)5 Q9 w1 G4 \5 [1 B& O. L
  198.     @config(priority=2)
    4 i7 u! h& v" J& \  Y
  199.     @catch_status_code_error
    * J8 L  W* Q) q
  200.     def detail_page(self, response):        # y5 q( B3 f; f* x9 _) H; W; }
  201.         NewRe1 = u'哈书', P* ~' _5 z2 t; t* i/ ]0 A
  202.         NewRe2 = u'huhjsd.CC'
    4 U) T" N# q/ ]2 f" q
  203.         NewRe3 = r'^\\n\\n'
    ' j* {0 j2 U+ ~' w
  204.         NewRe5 = u'小说网'
    / e: E2 C6 B) g
  205.         NewRe6 = u'fgdfgf'
    4 R" j  G$ E1 w! a" y: J7 D$ L
  206.         NewRe7 = u'fgfgf'
      P8 F! p! X5 @+ ~# O
  207.         NewRe8 = u'ffhgf'  x3 F8 {% T) c& }4 x" {
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    % I! @5 |4 o- v' T, U6 M: K
  209.         ReC1 = u'静思'
    ; x" z0 p" w- c
  210.         ReC2 = u'aghgf.com'
    + n0 F8 N* T# j- x" Z3 Z( [
  211.         ReC3 = u'aghgfh.com'6 \1 M) [9 r+ e- z. k- Z
  212.         ReC4 = u''
    2 o/ L: N* a/ ?* a2 f$ q; O. [8 l
  213.         ReC5 = u'文学网'
    ' c$ O8 u& L: \1 b
  214.         ReC6 = r'<BR>'
    / o* U8 y: y) U2 X  h
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    4 M( f) q6 D1 y0 @1 ~; x
  216.         print Bookname! K5 J9 o  N: j3 f1 L: i5 m4 b0 |
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类8 ?5 b: }- ^) b% W6 t
  218.         Book_author = response.save['Book_author']   #小说作者
    " s2 x* G/ S8 n# ?  y& e- s
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介* H8 j7 u2 E* Q2 B2 o4 |! }* f
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新$ ]0 H; ]( h4 v7 q1 _
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    ( x8 q8 |; G; `& u
  222.         Bookurl = response.url   #小说网址
    : j: \, a4 c8 @
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    ! [5 z$ l  |- F8 Y  T" h# |: q4 w
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    5 E) J' L) Q* u+ l, x- g0 t
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容- R1 Y1 ^$ _/ ?
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)* C4 D. q( ^/ ~5 X: D7 |+ \# z
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    ' D! k2 }5 W3 H" o5 r/ O0 C
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    * A9 P$ v8 x/ F! M1 n
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    0 v) Y* B0 z; f) h
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)8 W& D# f" L& W7 k: r
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)) _1 `) Q- s) b/ E+ M
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)( J$ `0 n& }% n* I
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)6 A0 V. w- n, [
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    5 I6 e% f5 k" ]( t: ^
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    ; M2 p) k1 ^6 \: @0 m: ?# `
  236.         print BookConte
    8 J7 a% v7 Q. Q& K5 {( L  V
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)" d/ U( s! a  V, Z4 [1 ?+ L
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2). n& K( J+ p3 a
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3): f9 E7 D9 x: D1 |
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    ) @- ~% ~( T% w8 @' H8 M
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     1 q2 \" s: B& v+ S8 _6 F
  242.         Book_img = response.save['img'],  #小说图片4 C3 E3 O; q: o
  243.              ! [# x, `/ C" A0 x
  244.         #insert into MySQL 小说入库% J" Y- }3 }3 e8 R* |, W
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布6 g+ ?1 @" f) u! u2 H. v
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    2 X5 B" I* s$ ~5 B* M$ @
  247.         #post提交发布
    & u6 G7 ~( k+ E) ~' }
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消2 m0 b* S, B7 u3 ~
  249.         Datos = {
    2 H; b" p9 u* Z, [0 x6 J
  250.                   "Cater_Name":response.save['Cater_Name'],& C2 i! h$ Z$ M  w: ]
  251.                    "Book_author":response.save['Book_author'],
    5 C5 W* a3 Q& R* t- u+ O( V: J, V
  252.                    "Book_Introduction":response.save['Book_Introduction'],- U0 ?; k# u  \* ~9 Q( G
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],, O7 L( t  a5 M' n% x6 Z  R( z- @) P
  254.                    "Book_Palabras":response.save['Book_Palabras'],( G+ h6 l9 E9 e' L4 a! X: \/ ~, }
  255.                    "img":response.save['img'],( h/ R2 V, q( Z
  256.                      }: C& }1 u7 p( X$ B( o% D
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    5 `- ?  y: R# x
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    9 s$ L) S7 ?; w. @7 Y# t" A
  259.         return {
    3 m0 A9 ]2 j) l8 ?3 J$ A0 t' g( g
  260.             "Cater_Name":Cater_Name,
    8 W# c5 R5 Z: w" t* A5 W, Q5 G
  261.             "Bookname":Bookname,
    5 j5 _& R1 X0 f& ]( ?7 m( \
  262.             "Book_author":Book_author,5 _, |2 Q1 ~& V8 j' R
  263.             "Book_Introduction":Book_Introduction,
    7 m$ t" O4 F& Z' ^( v- j, s8 y
  264.             "Book_Synopsis":Book_Synopsis,) j  v/ m/ x7 q' x
  265.             "Book_Palabras":Book_Palabras,
    * u+ X6 M, _% p% d) _
  266.             "Book_img":Book_img,$ I& j2 u7 ~# D
  267.             "Bookurl": response.url,
    1 K9 m( |; I) P9 o% d. C: B
  268.             "Booktitle": Booktitle,) L. M/ M( }5 W( i8 C9 l( O4 X3 k
  269.             "BookID": BookID,, M3 ^2 f4 [$ T* B" n, K
  270.             "BookConte": BookConte,
    . T! H1 P; Q. s% h
  271.             "Titleid": Titleid,1 U/ n+ q; b7 y( U3 y# d
  272.             "abover":abover,+ N* I+ {0 _; S" I
  273. #            "Book_Date" = str(datetime.datetime.now()),* s8 {8 N. }5 h" G7 [& d9 R) Q6 G
  274.         }
    ) J  u) H! y2 g3 s' ]+ p
  275.     def download(self, P_dir, imgDir, file_name, Book_img):2 E" C( X( K# v. `
  276.         if not os.path.exists(imgDir): 6 l. @8 y3 ^- b& @1 x
  277.             os.makedirs(imgDir)
    ) X& B7 r9 m3 C9 x0 V, B
  278.         file = imgDir + "/" + file_name
      K) |5 _7 `$ Q6 f+ `6 x1 h! A
  279. #        print file7 y3 [8 Z' i1 q$ k
  280.         f = open(file, 'wb+')
    8 K9 D/ M) o4 {- ~5 b5 [' ^9 Q, [
  281.         imag = requests.get(Book_img) " E  x" s8 J- [" ?3 }' L( k
  282.         f.write(imag.content), x6 ?  H3 @  D) j% \0 _
  283.         f.close()
    & J, k5 F6 y4 t8 B' b$ B& N0 b
  284.         #保存图片前) y$ a' N8 [8 ~5 I+ E3 C7 r2 G
  285.     def save_imgs(self,response):
    * [2 Q) V) L6 T# J; d
  286.         content = response.content
    2 Y- W( I# d6 I+ G- n$ k, ?
  287.         file_name = response.save["file_name"]
    / v/ a/ k5 l7 D! W/ y: s, ?
  288.         imgDir = response.save["imgDir"]
    , n4 J# E# T: X. a
  289.         file_path = imgDir + file_name
    # m' y& e8 l! k
  290.         self.save_img(content,imgDir,file_path)8 M; U& ?; O. Q3 F% k. q& X
  291.     #保存图片% y8 W7 v. h( l4 G$ Q. l1 Q! R
  292.     def save_img(self,content,imgDir,path):
    - V7 B" ]) x, X0 h' n* q1 S
  293.         if not os.path.exists(imgDir):                        
    : [- {  X  m7 R- a7 y
  294.             os.makedirs(imgDir)/ n, j1 E; e3 J& W; u2 V4 K' i, N( W1 q
  295.         f = open(path,"wb" )% v& J" N  ]8 x' S' m# _
  296.         f.write(content)& C5 O+ }( I& F' t
  297.         f.close()
      H/ q9 I1 i/ [6 ~  r
  298.     #获取url后缀名7 K  A4 w9 z" M' d' e& {& |2 T7 |
  299.     def getExtension(self,url):                            3 o$ S( r' _  v6 F9 r1 \% j
  300.         extension = url.split(".")[-1]# E4 R; ]9 v4 {+ {& e: z4 S
  301.         return extension ' i+ K% L% r% y+ i- `
  302.     0 e+ I9 ?' k# ^6 }7 I; L' |
  303.     #获取图片名$ }- ?# x  l3 x& \2 u: @
  304.     def getname(self,url):
    5 M7 w- w* Y* ~8 A* C  {, C# X3 b
  305.         name=url.split("/")[-1].split(".")[0]
    9 A3 g5 ~2 F1 l* l& @' S
  306.         return name
复制代码
: |0 ~* n; O2 p) {

. H1 ?# e- l# X# O1 C9 u
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-10-26 06:15

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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