找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!2 W% J( Y, q1 }2 g$ N  x
  1. #!/usr/bin/env python
    1 O& J: N8 \( Z: ~6 x
  2. # -*- encoding: utf-8 -*-
    & N0 j! S; p8 ]7 c0 H/ |& X
  3. # Created on 2019-05-05 21:43:11
    . E0 ^. x. M% |8 M- F4 _7 X
  4. # Project: XiaoShuo% f6 W+ W$ S3 q# f" O7 ~. c

  5. 2 {- W( t$ g# e# t# t
  6. from pyspider.libs.base_handler import *
    ! ]: g8 B) t* g  m. a0 _
  7. import pymysql
    * e2 O8 |* x* ]; H' O4 }* ]
  8. import random' K" W. D' O  c) \, r$ }
  9. import datetime
    4 m, d' n% w; ?" H! {; D6 ]
  10. import urllib2,HTMLParser,re+ d" Q2 p% Z( R
  11. import os# X, q) U6 |& A, G  _0 j2 M
  12. import sys
    2 J- G* j: `# C& E9 N
  13. import re/ N. _, t9 K  F  ?5 X% |+ h
  14. import codecs
    & L; {' X6 a. I" A/ e
  15. import requests0 @6 U2 G+ p. a# h0 d8 L' g0 F. u% ^
  16. import json& {6 y. k7 n% I+ k

  17. 8 W3 Q6 R* W; z9 u: w( [
  18. class Handler(BaseHandler):
    * s; Z( I6 s+ G2 z/ ^
  19.     global Datos1 i6 X; ?5 |1 {  F) e! j& c" f: n% j
  20.     global P_dir    . d4 [8 L2 P; j2 [
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    " p2 A0 E) x) R- S1 b/ f
  22.     global Datos# }- I- W" Z3 K. D: i2 H* k
  23.     Datos = {}) A. X$ p5 ]/ Z! L7 G; t
  24.     headers= {2 \3 {& b# P/ l9 V
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    ) R7 Z0 j' x5 \+ M' Y
  26.     'Accept-Encoding':'gzip, deflate, sdch',- R* h4 |0 W' |$ E* h* o, p
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
      |2 S: \$ Q, H- Y( `1 ?8 y
  28.     'Cache-Control':'max-age=0',5 u' i7 ~1 y5 M- I' I. ]3 U/ h
  29.     'Connection':'keep-alive',
    3 J* r, o4 p, f2 o
  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'
    - P7 N$ _+ [6 ~0 y0 K
  31.     }0 M3 x- i- S4 {& J6 N/ s
  32.     crawl_config = {
    : h. {% ^5 D# A( W
  33.         'headers' : headers,! f5 Y9 P4 @( t4 I% p, e
  34.         'timeout' : 300; [$ u# r9 F6 E+ s( s4 N3 W
  35.     }
    * |5 D5 Q; n- Y
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    ' `" |) C& O4 L: a1 V
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ) D# s$ l+ @0 H; W6 c8 {8 g1 B; c
  38.         try:' B. Y3 P1 ^4 }# a. K: a* H
  39.             cursor = db.cursor(). K' Z, |8 w$ n" Z) p! d! e
  40.             #注意此处字符串的占位符要加双引号"%s"
    ; A5 R1 W4 g8 a: D1 m. P4 X
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);# c  \9 z$ f0 v4 E* R
  42. #            print(sql). y  U2 g* J) d$ }! a$ \9 }9 i* D/ n
  43.             cursor.execute(sql)& U% G" G8 F6 r5 j; @2 `0 a
  44.             * b" ]# D  s3 p7 X
  45.             #qid = cursor.lastrowid' L8 Q# d3 g3 E7 w' c0 E. e/ c! y5 M
  46.             #print(qid)5 F7 y; o5 S; C9 g) V  H7 z
  47.             
    2 {. y/ W* z  g" b7 K0 O
  48.             db.commit()4 ^* r/ K: R2 F
  49.         except Exception as err:0 r( |1 W; S  [0 F
  50.             print("Error %s for execute sql: %s" % (err, sql))
    0 M; C* @) l+ E$ u) L* K; ^/ x
  51.             db.rollback()
    . L) e6 m8 N8 h6 c& m) P
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):  V0 N5 q) u4 \* V+ q9 ^  y* y
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"), l* N) L% V8 p: R% |
  54.         try:
    ( |! h9 {& a$ `
  55.             cursor = db.cursor()
    # E6 a; H/ e* z3 |
  56.             #注意此处字符串的占位符要加双引号"%s"
    * s9 f0 [$ R3 G: K8 `" O( X% R
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);. v( E; {4 F0 t" W
  58. #            print(sql)
    ( \8 x* p1 x8 M8 b
  59.             cursor.execute(sql)8 I" Z7 h! |, I$ E$ u/ J( ^# N
  60.             
    1 x' P6 F( v! P0 x0 A" D/ s3 L
  61.             #qid = cursor.lastrowid2 v; h  B  [6 o* E) `
  62.             #print(qid)) R$ F0 J# q6 i/ v  d- W
  63.             , ]2 ^% @5 v$ D6 Z5 ]4 X
  64.             db.commit()
    ; y' n8 _  p* F) a7 Y  s
  65.         except Exception as err:
    * W; J. R" H& T7 F% b3 r
  66.             print("Error %s for execute sql: %s" % (err, sql))6 V3 m$ a$ o: x- i) p9 l( H
  67.             db.rollback()6 ?! m( |9 \9 g! I6 ^1 o1 p' |
  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 e2 y1 g" Q2 K' M5 y8 p7 _9 X  L" C
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    5 j8 ~$ A  y7 ~' l# x
  70.         try:
    0 X+ y% |* C$ p5 [( c" u1 W9 z
  71.             cursor = db.cursor()
    5 `* s* l. Y; z/ l; h8 n
  72.             #注意此处字符串的占位符要加双引号"%s"# _6 V0 C* J0 o- l
  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);
    , D1 M% a5 H. W; H8 q
  74.             print(sql)
    5 z$ o# v/ g. k, T* D8 R2 m; d
  75.             cursor.execute(sql)
    ; {4 a$ X1 h0 \! l
  76.             print(cursor.lastrowid)8 ]3 i8 K! _4 w, L4 F4 ^. d
  77.             db.commit()
      H) S* t$ u9 J) R4 z! }* Q7 c1 B- I6 e
  78.         except Exception as err:$ e  _+ o& E1 \8 {7 |) ]$ t4 U
  79. #        except:/ m+ i* R! t  b
  80. #            print('Failed')$ z- t6 |4 i; D& R  d2 ?: n
  81.             print("Error %s for execute sql: %s" % (err, sql))
    6 W# n  |" }2 {* H2 j$ G/ f
  82.             db.rollback()
    9 ^& r9 a$ A/ q* v
  83.         8 E' f# Y$ Y  a7 C" L
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    7 Y1 ^5 ?+ ?# I
  85.             reload(sys)& O) [( a- A. M: |
  86.             sys.setdefaultencoding("gbk")9 n3 Y: X3 U% j. L" b/ E8 w, }
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址, U  f# T& q' c$ z6 L, K
  88.             locoy_data = {, O- w, ?5 l8 A& _  p5 ~6 a! B- @
  89.             'my_u':'用户名',   #后台用户名
    ) l8 R; Q. ?& O1 Q+ U7 l9 n
  90.             'my_p':'密码',   #后台密码* g) r2 `9 e3 E, n" p4 |( Q
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),' a! [# ~# B  e( A% d+ \
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),2 j4 ~$ |! b; M  P, r$ f4 L2 ^% F
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    2 P; n+ j( I# F4 }$ f
  94.             'article':BookConte.encode('gbk', 'ignore'),0 P5 S5 m6 o+ ?( Z' Y
  95.             'author':Book_author.encode('gbk', 'ignore'),
    3 u/ V$ ^9 e9 f" z+ M
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),5 S" d) F# U0 L2 B: Z" V5 z
  97.             'thumb':Book_img,1 O5 a  z9 D1 n+ x' _1 Q
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),  M) v+ C# X& G; ^
  99.             'abover':abover.encode('gbk', 'ignore')           
    5 c9 ?) u, `) k' p4 w2 {, |) i+ }
  100.                 }+ ^8 ]! T& G2 j0 ^' _
  101.             res = requests.post(locoy_url, data=locoy_data)
    : r+ l' G4 g; @0 W5 v6 v" ?
  102.             print res.text, b0 v. a8 ?6 @$ s( f
  103.             print res.content
    . s$ d" v' g% Y! q0 g
  104. #            print Dsd
    $ j0 d9 k! Y( c* P/ ^% Q
  105.             return res
    + o5 D1 Y. B( R; ~, M3 Z& U
  106.     & I- _. W" b3 G. p$ d7 s1 A
  107.     def __init__(self):, N  x: _, e  a- l/ P, {
  108.         self.base_url1 = 'https://www.****.cc/'4 R; u3 Z# q. ^/ P% K8 ^
  109.         self.base_url2 = '/'1 `% Y! V; [3 u! v$ [& m: k
  110.         self.CaterId = []- W) b( S1 D6 T  ?' m; s# ~
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    9 f4 T2 I" A8 w) X$ o* Z: \
  112.         self.page_num = 1( X8 I& V0 f( Y
  113.         self.total_num = 200   
    0 f0 n: T5 L7 I2 a3 L* N( P

  114. ; R6 [$ Y5 {7 u( |, l9 E0 h6 e
  115.     @every(minutes=8 * 60)' a* ~8 ^, Q- o+ H
  116.     def on_start(self):
    . E5 M" h; F0 p: z* i9 f9 H
  117.         global Cater_Name
    ) _, |+ t: z) m: R. v
  118.         Cater_Name = []
    - W4 ~9 x. v  ^, \% g
  119.         while self.page_num <= self.total_num: 1 ~/ O% c* U$ G: X
  120.             for self.CaterId in self.CaterIds:
    $ k* ~, a0 ?# Y; A) q# n/ b
  121.                 if self.CaterId  == 'xuanhuan':) N8 K. Z- z) I) m
  122.                      Cater_Name = '玄幻'
    - k& l. d( M3 W. @
  123.                 if self.CaterId  == 'wuxia':
    9 n! t8 Q! H/ J2 k
  124.                     Cater_Name = '武侠'
    2 O! |4 J* j8 k3 t) w) F
  125.                 if self.CaterId  == 'lishi':
    # B! M6 y0 Z  @9 s9 k
  126.                     Cater_Name = '历史'            
    % Q" X0 }$ P! C1 `: ^0 X5 b
  127.                 if self.CaterId  == 'yanqing':
    ; S5 k# W- A( Y! m9 i& j5 i2 D% i2 @
  128.                     Cater_Name = '都市' % P* X/ D) H- m2 J$ o& D& u
  129.                 if self.CaterId  == 'nvsheng':( B5 P0 T' F: s
  130.                     Cater_Name = '都市' " K* o3 G; ]& G' s& L; V5 h
  131.                 if self.CaterId  == 'kehuan':
    ; Q9 O+ U) m  b7 y0 L& E
  132.                     Cater_Name = '科幻' ; B% ^, d: S: L  S* v6 I
  133.                 if self.CaterId  == 'kongbu':
    + U  o* l+ t, Q
  134.                     Cater_Name = '游戏' : @1 n8 k2 ^* L) y
  135.                 print self.CaterId; o' n+ W4 X- }* |* ^$ g! q) ~% c
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    5 n$ n- X! h" u3 i$ B
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)/ R% z$ W4 l% f: g/ f: \" |
  138.             self.page_num += 1
    + t; o! F# v* j* ~8 [9 O+ c( j
  139.             
    ! P  \( O0 e/ }0 o
  140.     def list_Caterg(self, response):
    # H  [* a1 D3 c& R
  141.         Cater_Name = response.save# J7 h- e& G+ v6 g2 l2 W3 ?$ |# Z
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    ( d# ?% ~& V7 @; }, E; n
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)/ z8 q' @# ?5 q- X
  144.             2 x% {6 u7 x9 n
  145.     def list_Caterg_detail(self, response):2 E- O7 s  j/ U$ V
  146.         Cater_Name = response.save  @% A( T  f7 N* L$ G# [
  147. #        print Cater_Name/ h8 V/ S  {2 E& ?) h
  148.         Bookname = response.doc('h1').text()
    6 W# w: k! L" M0 R" `; B  Z' P
  149.         print Bookname$ J3 B3 g, O+ ]: g' ?2 N  C
  150.         Book_author = response.doc('.authorname > a').text()
    4 s1 i, ?9 Q* |0 ?4 {  c1 {
  151. #        print Book_author+ J/ O/ @$ j! |6 |$ l5 g
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    : H# d5 }( ]/ t+ c) E
  153. #        print Book_Introduction
    ! z. l( _/ J$ Z: h
  154.         Book_Synopsis = response.doc('b').eq(1).text()' G( k) Q* K9 u2 \
  155. #        print Book_Synopsis8 i/ [* j9 z; W  V. X; {
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    ' O4 t  W/ g3 E2 D. C) s- N4 j: P$ U
  157. #        print Book_Palabras
    6 m8 i1 Q: {% ]4 q9 t# ?
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID( h/ `* g* T9 r; D0 m; h
  159. #        print BookIDs
    3 R4 c6 A! E( t3 G$ B- l  W. I4 o
  160.         Book_Dates = str(datetime.datetime.now())         
    7 h0 q4 _/ z2 u$ G% o9 L
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():7 m8 h, `& e/ y4 b$ W
  162.             img = imgs.attr.src+ }5 l( e1 Y- S$ F7 K1 W; ~
  163.             print img
    - i! D2 U, W. ]4 y8 a2 b4 }
  164.                 #小说封面下载
    ; B( K; ~( k  s+ v
  165.             extension = self.getExtension(img)  D' t: J! K8 D3 A
  166.             name = self.getname(img)
    # o0 n# @! S% j" `
  167.             file_name = name + "." + extension5 H! Q) l4 B, z6 q+ K
  168.             imgDir = P_dir + name+ W) E6 M5 N) l
  169.             Locaimg = imgDir + "/" + file_name
    : c! ^0 k9 l7 H9 m
  170.             print Locaimg1 F) I  w0 C9 L0 ?. F3 I4 p6 N
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    8 N* s4 m6 x% |; |$ i, F  }
  172.                 print('attachment url is ' + img)               #
    . I% L: Q' M1 ?0 U. X8 m. ^
  173.             Datos = {
    6 i2 |# }4 q* l4 M- z: V
  174.                     "Cater_Name":Cater_Name,$ U& I+ y4 ?2 i$ P1 P( m4 J9 y
  175.                     "Book_author":Book_author,
    / F( O) K8 s# y4 i  C
  176.                     "Book_Introduction":Book_Introduction,/ `$ K/ r2 O, H/ z5 H3 ^" F: [
  177.                     "Book_Synopsis":Book_Synopsis,
    1 o  c8 f8 [6 K% T' O
  178.                     "Book_Palabras":Book_Palabras,. E( K. ]! A1 k1 E6 N, X6 S
  179.                     "img":img,8 t9 B( z2 D+ O! L; C9 \
  180.                 }
    . m, k9 Q1 H" q9 n: X; U2 h7 T9 d
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布- ~/ p! F  f0 a9 k
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():! ]8 b/ m* }! q+ S2 z* B
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    6 d; y' K' f8 a. R/ a4 m5 @
  184.             7 r4 e) \' s6 I: n& \, G4 C1 |7 n1 V
  185.     @config(age=8 * 60 * 60)   
    - ]$ ]6 E; I# J4 W$ k6 s* f
  186.     def index_page(self, response):
      |& a" D1 P+ }% u3 @$ V4 d  c
  187.         Datos = {- y7 d; C# e0 }% D# e9 S* m
  188.                   "Cater_Name":response.save['Cater_Name'],
    # d# ^- Y0 Q. D5 [" }3 n! ^
  189.                    "Book_author":response.save['Book_author']," \, ]# \$ E! N$ y
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    " x3 n# j" G' G& R1 f; z; |. f
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],% `8 N8 O1 J7 j8 A' v
  192.                    "Book_Palabras":response.save['Book_Palabras'],8 A1 f0 t) M: @# D7 W" F; @+ A
  193.                    "img":response.save['img'],: v% @7 z2 s, k' [% U! [
  194.                      }
    $ x0 q. r3 \: f: W
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    7 j: E, Z- H$ I0 I
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    - h# G0 g8 e- c3 a5 [
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)! x2 G0 e7 k! _$ v
  198.     @config(priority=2)* H7 ^7 E% O# {  _9 Z
  199.     @catch_status_code_error, k& m* s( J$ _! Z1 I7 x
  200.     def detail_page(self, response):        ( o7 G  {% Y1 Q
  201.         NewRe1 = u'哈书'2 w- B/ ?; |; C9 K8 O5 n
  202.         NewRe2 = u'huhjsd.CC'
    ! F5 p+ [# t- b% B
  203.         NewRe3 = r'^\\n\\n'& F& F  n) B! K. e
  204.         NewRe5 = u'小说网'# b/ }. X8 J- ?) t) X6 ]
  205.         NewRe6 = u'fgdfgf'+ [7 ^9 `( B5 r% c# x
  206.         NewRe7 = u'fgfgf'4 k5 @: }: X& n8 V
  207.         NewRe8 = u'ffhgf'
    6 a- U/ X  z& J# i
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    " ]: N, J+ o6 @/ p: h4 u
  209.         ReC1 = u'静思'
    ! M0 }6 M$ u. {' U4 [/ A, b
  210.         ReC2 = u'aghgf.com', N8 f* K- ~& f& A' G
  211.         ReC3 = u'aghgfh.com'
    $ K- R1 r% k# _
  212.         ReC4 = u''5 o0 P* b# Q, ~1 M" R
  213.         ReC5 = u'文学网'& _' u3 n4 B1 W& K
  214.         ReC6 = r'<BR>'
    ) v( s! @' `% t/ y
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    . M" c+ H- W+ u) W* U$ z, V$ w
  216.         print Bookname3 G* B) ~$ K/ }& @- \/ x
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    3 W( u8 n( S7 t1 B5 \
  218.         Book_author = response.save['Book_author']   #小说作者" T+ y. ]8 K. _  w8 p" s
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介: t( a: ?6 _+ l
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新( X! ^8 H3 D8 R+ T1 t3 m$ B. Q  s
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数% ?8 l6 f5 ^& V
  222.         Bookurl = response.url   #小说网址
    4 Z- F7 f+ N* n; Q& e
  223.         Booktitle = response.doc('.article-title').text()   #章节名称" |0 ~- U& b! \2 y# p
  224.         BookID = response.doc('.readset-r span').text()   #小说ID% c/ t8 l$ W6 i& Q
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    % S5 \+ `' _7 n) y* W
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    . i+ C* \1 m0 z8 z
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    $ ]5 {- L/ Q' h$ U6 |2 s7 _3 O
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)0 G! P" n" K' ]2 n1 h
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    & H3 D* [. @2 S3 A5 ~5 z
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    # _2 k- i9 i& F. |# ], D% g7 g7 _
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2); ~$ O: V9 ?9 l
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)9 ^! U! n& e- a) b( @
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)7 `+ y/ ?! s) M  M
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8): A! z2 z$ Y6 r9 B/ e
  235.         BookConte = BookConte4.replace("\n\n","<br>")3 v. |; x! Z  _9 z/ ~# p- Z/ U
  236.         print BookConte5 |% `# T9 o! O* z$ w: p
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    , s1 h. I# a9 j' A$ y/ n6 F
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    " |4 S' U! l4 g  `! @# G
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)" a0 s, m0 L. C. B
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    , q. ?( T3 m9 N7 F; v
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     4 {1 b& B9 n3 w9 c
  242.         Book_img = response.save['img'],  #小说图片
    6 s  ?" G; F9 U  i/ ^# C) _
  243.              0 m* E5 s/ V, I) A  h! l* h
  244.         #insert into MySQL 小说入库( K6 \1 b" ?0 e9 s( B6 [. H7 y5 m
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布5 d! E+ Z; @) Q1 G( ^! C& o8 Z
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    8 w- \7 X# V2 P5 H
  247.         #post提交发布
    7 S6 E' E% m: H3 I" D
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消$ T& O5 ^- V$ g/ i4 I6 |
  249.         Datos = {
    3 A- R8 D8 B5 y8 D3 S  C3 }* K
  250.                   "Cater_Name":response.save['Cater_Name'],
    # t# V% [9 R" x% ?$ Z
  251.                    "Book_author":response.save['Book_author'],4 T. O" x+ y/ T" a- s
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    & b3 r% q/ y( }  E; x$ e
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    7 o1 t2 f, |7 s1 m2 @* t
  254.                    "Book_Palabras":response.save['Book_Palabras'],6 \$ q7 t( E5 O( y4 y
  255.                    "img":response.save['img'],
    / `4 K8 {: C5 Q* k3 ~+ M7 Q# U( ~
  256.                      }# V% Q! ]0 {7 G5 k% g2 }2 v' g
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    0 O3 p5 s- T/ q
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) : q0 i3 N% I2 a& g
  259.         return {
    & [& B- u9 R: `8 O! F- ?  {
  260.             "Cater_Name":Cater_Name,
    : {0 P. L, |. P' R
  261.             "Bookname":Bookname,
    : F, @; I0 o- _: s+ s6 o
  262.             "Book_author":Book_author,
    ( U2 l8 N4 u- e6 g& n7 N
  263.             "Book_Introduction":Book_Introduction,
    4 p2 F. }/ c( y' t9 Y0 i3 J
  264.             "Book_Synopsis":Book_Synopsis,# P6 r9 f5 }3 @0 x) v$ I- H" C
  265.             "Book_Palabras":Book_Palabras,! Q: M" h, P: j7 ~, |$ @8 q1 c
  266.             "Book_img":Book_img,
    9 i0 G6 T' n) {+ M$ F  _
  267.             "Bookurl": response.url,
    9 O' y% o# w- \9 m# r
  268.             "Booktitle": Booktitle,
    8 J: H3 R! k% Z- o7 h5 G! i9 W! E; W
  269.             "BookID": BookID,
    5 S2 I& m9 ]8 r# d& M, r' h9 B
  270.             "BookConte": BookConte,* \9 q  Q( p% H9 g% V
  271.             "Titleid": Titleid,! d, l  k% V" D3 [3 @3 ^" ~+ @
  272.             "abover":abover,2 ]7 G7 O; K% c4 e/ n
  273. #            "Book_Date" = str(datetime.datetime.now()),
    ( M" e2 W5 B, E. `
  274.         }
    ; K" ~: H7 ~0 f+ {# N, l, C
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    ) d' {) F( U/ z, a) y
  276.         if not os.path.exists(imgDir): 8 Q; M' Q5 j- ^/ Z
  277.             os.makedirs(imgDir)5 N7 p7 l6 ~& |7 W
  278.         file = imgDir + "/" + file_name
    4 R. T7 ]( L7 [, a5 q( G9 \; h
  279. #        print file
    6 E$ M$ W; C6 \; n- r  `; ^. @' J! L
  280.         f = open(file, 'wb+')
    0 V* y4 b: j0 v+ h* L! l8 d& p
  281.         imag = requests.get(Book_img) 3 m5 e! R% ^, J  j5 j* c
  282.         f.write(imag.content)
    " n* z) _% |4 o  @- T
  283.         f.close()0 O0 v* k: [0 Q* ?8 l
  284.         #保存图片前1 X/ b  y, Q& O
  285.     def save_imgs(self,response):4 i8 B& v* G* o9 h0 e6 [* L$ z
  286.         content = response.content4 A( B4 G4 f  Z4 |! C" Q8 l  W
  287.         file_name = response.save["file_name"]( j0 O) h1 S/ [# y
  288.         imgDir = response.save["imgDir"]7 T. v; V( s1 s" A
  289.         file_path = imgDir + file_name
    9 a: S7 r! u9 O( H4 o' D
  290.         self.save_img(content,imgDir,file_path)' {* M  T. @* W( V, b3 k6 M
  291.     #保存图片
    : g8 X+ e' g7 c  J$ ~  c. m3 e3 a
  292.     def save_img(self,content,imgDir,path):
    2 r( x' ^2 X, ~; O7 ^) q
  293.         if not os.path.exists(imgDir):                         ; t) H8 f" I$ N! Z; q& P: \
  294.             os.makedirs(imgDir)
    ! U. `- {/ Z) C, x" b
  295.         f = open(path,"wb" )
    + u# T8 ~; u+ c+ W2 A/ n
  296.         f.write(content)) x2 u/ V! \8 }: W1 |+ p( w9 A
  297.         f.close()
    7 ], n4 T- z# t8 N6 X
  298.     #获取url后缀名2 C! E5 i  a. |2 x* \
  299.     def getExtension(self,url):                            * }+ t4 f4 u1 H
  300.         extension = url.split(".")[-1]
    ; A2 q! J- _. m: D* z% ?* D( e
  301.         return extension
    2 l  \, h" J' M, K% u- E
  302.    
    8 v* g, [$ L. }$ s$ h4 l: s
  303.     #获取图片名+ i3 u8 Y( R7 L/ I# L
  304.     def getname(self,url):
    6 u: d8 {; ^1 _7 C% }/ L9 p
  305.         name=url.split("/")[-1].split(".")[0]+ d# A* x$ r0 J9 G$ y. S
  306.         return name
复制代码
2 T  |8 `6 W5 s5 E: y& @
. `& N" }* D" g8 }# ~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-19 07:03

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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