找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!0 W, S# B( e+ k7 S( j3 [' y
  1. #!/usr/bin/env python6 Y; y" g" x  t" u' P9 i
  2. # -*- encoding: utf-8 -*-
    3 T# h! x( @3 V2 r7 X% Q- z
  3. # Created on 2019-05-05 21:43:11
    $ x3 u2 }8 c9 f, s8 w2 K" S
  4. # Project: XiaoShuo
    8 g) l# d+ D! x$ `

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

) O+ ?! |& f" C, J. x4 q+ r+ r
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-16 01:56

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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