找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!# O( }! I- r0 ^# s% P2 O
  1. #!/usr/bin/env python
    " X' A2 _! T5 Z" I8 M0 }+ [
  2. # -*- encoding: utf-8 -*-6 T, Q$ g6 R8 K  k
  3. # Created on 2019-05-05 21:43:119 t, P7 ?3 h% z% k, j
  4. # Project: XiaoShuo
    8 E! s# w& n& P8 w4 A
  5. ' o: t3 [4 J- _$ T* y! z: }
  6. from pyspider.libs.base_handler import *
    / o/ D# r  B. ?
  7. import pymysql
    ; j# X% \7 ^1 m4 R+ f* v& y
  8. import random1 _& Q% G; `; d( c+ h
  9. import datetime
    8 \( |5 X' f& N' K5 \- \5 [
  10. import urllib2,HTMLParser,re1 m  L* g, k3 f4 S" y2 {& N$ F
  11. import os$ c( F- m; I* C) g
  12. import sys
    & }- a! D- P# B# o
  13. import re7 f( C4 v! ~- {1 @) N/ [' W
  14. import codecs
    ! T* ]% n/ P: |( @. p! y& L
  15. import requests5 C8 B1 _; G% {8 l1 S& j2 D
  16. import json
    1 [0 Y/ P& r  v5 ^3 V6 U) e" e

  17. 5 _" X1 j# Q* O) h
  18. class Handler(BaseHandler):, l. n* z! T2 [( a  V
  19.     global Datos
    6 o- J9 m8 n/ R' `' T
  20.     global P_dir   
    & [! n* B' F. x# v% l) f: E
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    / O6 |" D4 B) L! x
  22.     global Datos6 L; ?7 m: F8 j! P- K) l
  23.     Datos = {}7 \$ Z& t' d/ ^" k7 s2 _
  24.     headers= {9 J& W) {, C; t5 Y5 h; B8 e7 M5 l- c; X
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    8 C* S; n1 L( P0 a
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    & E9 p1 Y3 `2 f8 C0 ]8 h
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    " S. F6 n1 d% u" {% \" X
  28.     'Cache-Control':'max-age=0',
    , S( h. Q* Z/ ]$ [' z5 ^5 U, t
  29.     'Connection':'keep-alive',
    5 Z, t# d7 ^; M
  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'
    2 K: |' U6 q7 B& _( r- k" _
  31.     }
    8 a5 {% V) }  j- d8 K* t
  32.     crawl_config = {2 b1 ?7 q2 \0 }! V% N! I- o
  33.         'headers' : headers,
    6 `8 M1 d' u5 Y
  34.         'timeout' : 300
    " b$ @' U) [3 u& Y0 B
  35.     }9 T* M/ a; q) ]" f
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    * E: [4 b& N9 l# \* C
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ; x! E1 r; r" P+ o& E5 i
  38.         try:
    ' z, i2 k# ~+ ^' h7 a
  39.             cursor = db.cursor()! M* p) ~6 H9 R  {! k3 L& k
  40.             #注意此处字符串的占位符要加双引号"%s"
    * F3 L5 B5 Z% n5 B' @5 ~+ j) T$ A
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    * i- d: p, `4 ?# t8 O
  42. #            print(sql)
    6 P6 o( f! r( H- V" Y7 N
  43.             cursor.execute(sql)
    , A! F4 Y# B9 o
  44.             
    5 [3 f2 V6 s$ p& T( l$ P  k3 a
  45.             #qid = cursor.lastrowid
    8 K' a5 V$ |9 B" _- O
  46.             #print(qid)
    4 {# N3 p' E# i
  47.             
      O+ X# V6 X  K+ o! o! Y0 g" B
  48.             db.commit()2 |  [+ n2 w; @0 {+ U" u- Y
  49.         except Exception as err:7 `* i2 d2 S0 B
  50.             print("Error %s for execute sql: %s" % (err, sql))6 S, ]! w+ d+ y, D
  51.             db.rollback()
    / o, ?9 q  P  a
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):$ l) z, X' Q/ i4 i* R2 p- g% q
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    1 f6 g5 {0 X; \2 k: V
  54.         try:8 G( U+ M2 N6 J9 @5 t
  55.             cursor = db.cursor()
    0 X+ p) V4 ?) h7 E' {1 q
  56.             #注意此处字符串的占位符要加双引号"%s") z+ h6 v- y# V% S2 {
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    7 ]; e+ [/ L; k# w! C; j
  58. #            print(sql)
    * C1 z* {$ u* `/ }9 u
  59.             cursor.execute(sql)3 p1 \  N; m$ m4 f' P2 S
  60.             
    7 H/ x$ m9 L3 o/ z
  61.             #qid = cursor.lastrowid5 _+ o; [* J. ^; {, ~( z
  62.             #print(qid)
    . G# L/ l* ]+ n* |3 V( l0 `: m
  63.             4 a9 \) |8 t; }
  64.             db.commit()) ?. `' d4 W" X3 e$ m3 E! r
  65.         except Exception as err:3 [- m' X) X' I4 ~
  66.             print("Error %s for execute sql: %s" % (err, sql))+ ^$ m( U( @, Q8 H
  67.             db.rollback()' g) J5 t7 S+ G
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):0 W; K( z" I+ l9 U
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    9 K2 g, ~0 u! C( S, a5 S
  70.         try:& i, C! l3 a/ p4 O1 C6 s
  71.             cursor = db.cursor()7 T6 g9 z- c0 `6 D4 }* v8 x
  72.             #注意此处字符串的占位符要加双引号"%s"7 }; w5 N) \6 k7 z
  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);7 W% ~: d( v& @" p. a
  74.             print(sql)1 i% l! S4 Q, ~. O
  75.             cursor.execute(sql)
    0 N0 f: q/ p8 b2 b
  76.             print(cursor.lastrowid)6 R& m6 s6 z' g, S
  77.             db.commit(). j" ~1 N5 U( l7 t4 ]( o
  78.         except Exception as err:
    ' ~# s  h8 L9 m% K/ W7 S! r' }& f
  79. #        except:7 d& F" e- Q) O8 s2 d, S; s
  80. #            print('Failed')# l4 `6 z6 v5 m0 L# l$ p
  81.             print("Error %s for execute sql: %s" % (err, sql))
    " z2 E$ h/ ?, f5 W! \1 K+ i9 W
  82.             db.rollback()
    7 T) q' t9 @% c7 }+ }
  83.         
    0 N# F: V0 X$ G4 N% K1 B7 x
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): 7 f1 B. B, |* L1 Z4 l: C2 _8 A
  85.             reload(sys)- x: ?" }0 N5 J9 B
  86.             sys.setdefaultencoding("gbk")
    3 L& @) b. `6 n+ B9 O5 k: V. R, V
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址# |- p6 f1 V5 V
  88.             locoy_data = {
    6 s7 R/ Z. e5 b& D
  89.             'my_u':'用户名',   #后台用户名
      E4 h) R6 K) ~6 V
  90.             'my_p':'密码',   #后台密码
    ; [% b0 \" G3 I6 q5 V
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    " G. i$ P0 F1 E: g, Y# g
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    7 h% O3 S4 c. j' [' m
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),0 q( e5 e9 N) J% m8 S
  94.             'article':BookConte.encode('gbk', 'ignore'),% }9 P: h8 T! N8 y" h' v
  95.             'author':Book_author.encode('gbk', 'ignore'),+ r+ S4 m3 ?8 k7 ?
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),0 Z1 ]# x) v/ w' M* f+ {
  97.             'thumb':Book_img,
    - c  s2 N" Z/ X
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    ' I, A: C/ |! a' Q) h/ g
  99.             'abover':abover.encode('gbk', 'ignore')           9 N, K& U  \$ U3 [( z
  100.                 }& m4 x9 r! ~9 E8 f# i8 E
  101.             res = requests.post(locoy_url, data=locoy_data)- C) ], t9 j5 M3 K1 q
  102.             print res.text) b" `1 o$ R. h! S& s
  103.             print res.content5 Q7 ]* ?) P0 W" `- d
  104. #            print Dsd
    * o7 _: g, @) c
  105.             return res" V' U" H! R4 k4 s
  106.    
    # A! Z% ^$ k" ~, K
  107.     def __init__(self):
    $ V1 I% X  p6 `
  108.         self.base_url1 = 'https://www.****.cc/'6 @& }5 Q, Y- _; B% X
  109.         self.base_url2 = '/': H/ G# V- h' z; H! }+ @
  110.         self.CaterId = []
    $ l' k5 U( T6 G  i  O9 D
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']& ^1 S# a: i/ ]0 k# ^
  112.         self.page_num = 17 T2 ~( s8 x3 O( H' K8 ~+ r
  113.         self.total_num = 200   - e4 I4 H- b8 e' f3 @( B1 ^/ C8 V

  114. 9 c" S7 z  T. u% \6 L+ M" Q
  115.     @every(minutes=8 * 60); y$ _$ f0 @! J5 z
  116.     def on_start(self):. ^) }2 r% ?$ s6 i: ~) x! C3 s+ H: l
  117.         global Cater_Name3 ?4 U$ K  s2 C
  118.         Cater_Name = []
      Q& ^, [7 }  N/ p0 B
  119.         while self.page_num <= self.total_num:
    ( `) q* g: m6 d0 l0 \/ M& d
  120.             for self.CaterId in self.CaterIds:
    3 `5 V: y! m& w( ]
  121.                 if self.CaterId  == 'xuanhuan':/ O  H; o# h# ?9 v
  122.                      Cater_Name = '玄幻'
    ) m' h4 W3 Q: G, |
  123.                 if self.CaterId  == 'wuxia':; n  V7 `$ Q; z
  124.                     Cater_Name = '武侠'3 A* v" r1 \6 m! a
  125.                 if self.CaterId  == 'lishi':7 p. y; w% \$ R+ _5 R( n
  126.                     Cater_Name = '历史'            
    ' ?' E) C, O( ]7 [) R
  127.                 if self.CaterId  == 'yanqing':$ @1 b( f7 @$ i( C) b: B" T6 B7 k
  128.                     Cater_Name = '都市'
    3 n# o8 ]. D  Y0 V5 I; c
  129.                 if self.CaterId  == 'nvsheng':0 e$ O' p1 _( X9 a) z# p' `
  130.                     Cater_Name = '都市' 4 t2 k( G8 E- t: G# f7 z
  131.                 if self.CaterId  == 'kehuan':
    / i/ i! O) Q5 H
  132.                     Cater_Name = '科幻' " s( M4 u  m$ T/ k
  133.                 if self.CaterId  == 'kongbu':
    ' ?" }, p0 x  |; R
  134.                     Cater_Name = '游戏' , v; d5 T4 Z7 I# l
  135.                 print self.CaterId& L* m0 W3 v% ~3 h& v
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    2 \1 _: T! u- v$ {
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    / t0 l3 ]7 F) G1 R) y; L
  138.             self.page_num += 1 8 z2 S1 v# \# V7 D5 X, q
  139.             $ Q; o0 d& D8 J1 w( A! L( i
  140.     def list_Caterg(self, response):2 m1 ~. X1 L# V
  141.         Cater_Name = response.save7 K% ?+ N$ {- y5 V4 a
  142.         for each in response.doc('.pic-list a[href^="http"]').items():3 s& |, O) q- i* E/ P, q
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    , G  S6 L& D4 U. D# a  \9 |2 R
  144.             
    9 L+ \! O# \3 a% H3 W9 B
  145.     def list_Caterg_detail(self, response):
    - ]! ^# V) p3 [9 m( ?1 M
  146.         Cater_Name = response.save
    ) E' n+ T" k+ g0 L: n( P$ _
  147. #        print Cater_Name: h0 y% x6 x; O! \
  148.         Bookname = response.doc('h1').text()& m9 ?7 U/ N# F2 X0 [+ K
  149.         print Bookname
    / T! Y1 q& d0 x! J0 E
  150.         Book_author = response.doc('.authorname > a').text()
    - m1 J  \) R- ?
  151. #        print Book_author
    . Y& `5 z# f- |- [
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    ( W+ Z# m7 \3 X) W4 `8 W- z, L
  153. #        print Book_Introduction
    ) _4 p4 S4 j6 u% N1 G5 J. T
  154.         Book_Synopsis = response.doc('b').eq(1).text()! r' l4 Z6 V8 o' H8 v/ @* y
  155. #        print Book_Synopsis
    ' G3 }2 ^# N# C5 u8 U
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]8 j: H2 G, B7 e7 d! L2 h- q
  157. #        print Book_Palabras
    1 l' i; |% v; `, H) Y4 `
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    ' _, c, }4 K* d1 d
  159. #        print BookIDs
    5 p9 x/ V$ M+ I
  160.         Book_Dates = str(datetime.datetime.now())         
    , t! O! f8 p4 p
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    + y& _0 p. {* e  W. L0 O0 y2 \
  162.             img = imgs.attr.src
    . P/ x/ X0 n, x
  163.             print img8 Z9 A0 X* K7 L+ Z# M- v, k" n0 y" L
  164.                 #小说封面下载
    0 u( c9 U5 T1 H, e
  165.             extension = self.getExtension(img)
    & i5 ]) q! j4 h8 M6 b$ Q1 X+ }
  166.             name = self.getname(img)/ O: B2 \, I% Q; v/ t, e/ z/ p8 L
  167.             file_name = name + "." + extension
    9 |0 y/ E4 i( J$ i7 h  W& k1 B
  168.             imgDir = P_dir + name
    ! u% D; [8 ]$ e& {
  169.             Locaimg = imgDir + "/" + file_name
    . L3 c" O/ ~3 r1 `% n: S8 F9 E
  170.             print Locaimg6 U, d9 ^0 |# x/ ]
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    * K* A; F0 I+ }" @( R& A
  172.                 print('attachment url is ' + img)               #
    6 a2 d$ P  o: ]: U9 e
  173.             Datos = {; P4 U2 K* u* M
  174.                     "Cater_Name":Cater_Name,
    2 p' h; B! i; k8 E1 a% s$ ~
  175.                     "Book_author":Book_author,
    1 b; h* J' r# V- S
  176.                     "Book_Introduction":Book_Introduction,9 e5 ?4 J( \7 Y
  177.                     "Book_Synopsis":Book_Synopsis,
    ; i+ j* y/ X2 e* ~. Q/ F
  178.                     "Book_Palabras":Book_Palabras,
    4 O- P, {& F2 ]* O' M
  179.                     "img":img,0 @" i8 k$ e3 f/ `9 q
  180.                 }
    3 D3 Z  A& o/ @8 V: x: A4 G2 ~/ P) f
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布4 o, p6 O; @3 x2 D
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    ; k( j% w  y, q5 L/ ^! B
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)! m# _) u9 Y. [+ j
  184.             1 H- J. e- @6 d
  185.     @config(age=8 * 60 * 60)   
    % {# _3 A5 C( A. T+ l9 f
  186.     def index_page(self, response):
    / s7 K  J8 i5 y# m8 E: O4 @. ~$ X
  187.         Datos = {
    4 i! }. C9 ^, I2 g& P4 U" `
  188.                   "Cater_Name":response.save['Cater_Name'],
    . V! a8 D: j, j# }, ?, `6 C/ Y" c. w) [
  189.                    "Book_author":response.save['Book_author'],
    6 A2 ]- t/ G5 M
  190.                    "Book_Introduction":response.save['Book_Introduction'],7 j9 K7 n5 u/ R5 [% A( o
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],2 D( p! L4 \) H7 ^, G0 B
  192.                    "Book_Palabras":response.save['Book_Palabras'],
      s& ?4 P4 w" ^/ v4 P
  193.                    "img":response.save['img'],% _5 T0 \' H. F
  194.                      }) i; R5 i, b, p: Q7 M9 }, ^
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():9 ^/ j* f  E  [$ X$ b
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  8 d* F( r! D2 O
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)$ l8 B" Z! H3 G1 c. M+ Y
  198.     @config(priority=2)6 P4 ~- p/ i* d! g& }) |
  199.     @catch_status_code_error4 u; f* B& n/ \& o$ }8 {1 g. m
  200.     def detail_page(self, response):        # v+ e% O& A2 t. T- o
  201.         NewRe1 = u'哈书'
    , }7 [1 Y. p( r: P0 m6 c' P" B
  202.         NewRe2 = u'huhjsd.CC'
    1 W* F9 R( B3 C8 S* K
  203.         NewRe3 = r'^\\n\\n'
    4 j( M# j) U7 l6 u
  204.         NewRe5 = u'小说网'6 m5 @' O4 K& p9 ~& H* B
  205.         NewRe6 = u'fgdfgf'
    7 S2 p9 Q- X& W1 a8 j2 l
  206.         NewRe7 = u'fgfgf'
    4 e5 L7 v" P' w6 l; ^
  207.         NewRe8 = u'ffhgf'
    0 `- ~8 \( i& e1 }9 T6 e" X$ U9 [; |# x
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'0 }7 T! c2 T* q9 B
  209.         ReC1 = u'静思'9 h9 s+ K. |5 l
  210.         ReC2 = u'aghgf.com'
    & l& a' f: Y' Z( _7 z
  211.         ReC3 = u'aghgfh.com'
    " X  w* F6 a3 t6 T
  212.         ReC4 = u''( z# L$ s9 R# }3 w. o! c5 t
  213.         ReC5 = u'文学网'
    ( k! i0 a8 A' D. K4 c
  214.         ReC6 = r'<BR>'
      u* z. C* R" x+ C1 m8 }" T
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
      j: z0 ], X! I; q
  216.         print Bookname
    ( t, x- z8 }9 C4 c. ?8 R0 Y( P  O" t2 r
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类6 w+ U# ^" l5 d. [8 G* e- ]
  218.         Book_author = response.save['Book_author']   #小说作者
    2 t% V  D4 D6 Y
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介+ ]- l: z$ M) L8 e7 |
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
    , Q2 X$ s2 [* [* S3 _3 E
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
      X) _' H# h/ L+ h
  222.         Bookurl = response.url   #小说网址. C' p, e: n9 g
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    : r# v( V5 t9 Q' {8 |. j5 C
  224.         BookID = response.doc('.readset-r span').text()   #小说ID3 d) Z% x3 r" q, i- P3 I
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
      C: v* {8 D9 o0 K5 S
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)! e6 D; W; b3 n1 g  m% p
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
      R; U, Y. Q9 R" D
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    ( K! B" T0 H6 O' w  y1 r  G2 }
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    + e+ E# r; ^: P( G8 O$ V
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)- k' ~! _3 ?% O" i% n/ ?# _1 r
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)% G+ S6 ^, Q) `5 ^
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    - y# @/ H! w, ^+ E6 [7 z! p) ]5 N
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    - ^6 j7 F! o9 r& A  l$ D
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    " d; a, h' N. e* ~  P) e
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    4 `2 q$ O8 T* @) h: ^9 n
  236.         print BookConte5 F) \( \# U, Q8 I* O
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    6 t1 I3 i8 i8 B4 e
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    3 o( N7 P8 A; T- c! K7 X+ G  d) j
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3): |: L1 C; N# `8 `) E
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)7 s- x* k: q+ g8 g9 w
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     ) n# G, [' D# o, C/ ^4 A
  242.         Book_img = response.save['img'],  #小说图片
    3 j& n2 X+ s4 c" V: w% j$ {5 N
  243.             
    7 m1 _  o4 B3 P- e
  244.         #insert into MySQL 小说入库4 L/ e5 @) t9 ^
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    ' L. p4 Z" {3 W* d3 k8 `/ l& A
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布9 e9 P! a* b, {
  247.         #post提交发布3 t$ G' p, ^* G) g3 t
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    - u* q4 v' _" \: d( A
  249.         Datos = {" j# U; F  G6 d! C2 r
  250.                   "Cater_Name":response.save['Cater_Name'],
    . P+ m! r- F5 e) B
  251.                    "Book_author":response.save['Book_author'],
    7 j. y: @' k* q8 P6 `) h
  252.                    "Book_Introduction":response.save['Book_Introduction'],0 `- o) `9 ^: [: F
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ! \+ a0 z2 _) N! L$ s
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    " Q/ v# N( N9 z* u# }0 @" t3 V: e; F' U
  255.                    "img":response.save['img'],( r8 s3 ^; R/ c4 d
  256.                      }
    # V7 t7 a* o" k8 k
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    & w" i- _7 ?; O9 V- g* u
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ! Z' w: C8 @# R/ ^
  259.         return {% @4 C* b8 s6 `9 H& R" m
  260.             "Cater_Name":Cater_Name,
    - N9 c2 p* \7 {) |, ^
  261.             "Bookname":Bookname,
      J9 p$ _  i2 T* \
  262.             "Book_author":Book_author,) R8 S5 T& t% g/ x
  263.             "Book_Introduction":Book_Introduction,% v- r4 s, L& \2 e& h4 d- X
  264.             "Book_Synopsis":Book_Synopsis,
    / q$ O9 Z) Y2 a6 H! E8 p/ b5 |& f2 O
  265.             "Book_Palabras":Book_Palabras,3 q3 V) }: N' E6 A( {
  266.             "Book_img":Book_img,
    2 w: t) k7 X" C
  267.             "Bookurl": response.url,' Q7 T9 I, t7 ?; n
  268.             "Booktitle": Booktitle,
    8 R/ W1 X8 `+ Q/ f# t
  269.             "BookID": BookID,# P. I+ U2 d0 p8 V5 a- \5 j
  270.             "BookConte": BookConte,. T5 Z9 E/ r  \' F% Q
  271.             "Titleid": Titleid,
    $ b7 q% k8 R1 u) e3 H  U9 o
  272.             "abover":abover,
    ) K: y1 i! ]9 V; _( Z: ?3 x3 B
  273. #            "Book_Date" = str(datetime.datetime.now()),
    5 C" m' j/ [& b' p/ Q
  274.         }
    " l8 k/ v0 V/ I: f) l- I. U. x
  275.     def download(self, P_dir, imgDir, file_name, Book_img):$ l$ d! S: L9 {  U1 b
  276.         if not os.path.exists(imgDir):
    ( A4 ]) e; r( h' R
  277.             os.makedirs(imgDir)4 I) w6 O4 U$ D# W. ~
  278.         file = imgDir + "/" + file_name! M& c4 M) J% r' j& e- ^' n
  279. #        print file- H% Z2 @: G1 Z( ~" t
  280.         f = open(file, 'wb+')6 `/ j: H4 O6 c1 [
  281.         imag = requests.get(Book_img) , K& P' D  B' L0 l; U
  282.         f.write(imag.content)' c- @5 s8 b2 P8 @5 m: c, x' {
  283.         f.close()
    7 o, N! ]( [1 W. f% l! J
  284.         #保存图片前1 \0 g! e& I, [& F3 X' d! |, m3 X
  285.     def save_imgs(self,response):: _# k7 ~9 X0 }, c
  286.         content = response.content# A# r" z: _; h( D
  287.         file_name = response.save["file_name"]" @" m  P& y' ]/ p
  288.         imgDir = response.save["imgDir"]
    ; n# A; [! B8 u
  289.         file_path = imgDir + file_name& k; i5 V! G' y9 j! H
  290.         self.save_img(content,imgDir,file_path)
    & v# Q6 |) ^! ]3 H1 P- M4 c
  291.     #保存图片/ n% A+ m% N* v4 z# ^
  292.     def save_img(self,content,imgDir,path):
    5 F+ |. _5 C( {6 T8 `
  293.         if not os.path.exists(imgDir):                        
    + c! p/ D2 v# k
  294.             os.makedirs(imgDir)
    + q2 W( [! Z% O' d; y; U
  295.         f = open(path,"wb" )
    ; ]2 Y; V9 L9 ^; n/ F
  296.         f.write(content)/ M& q' @! o- c, z5 `3 g
  297.         f.close()* Q6 Q0 V% W, h
  298.     #获取url后缀名
    2 b2 o# L* X2 N% \
  299.     def getExtension(self,url):                            4 z( o' [5 @2 @) L2 \* I
  300.         extension = url.split(".")[-1], J& S6 }% M0 J( T
  301.         return extension ) v. R" q9 a! H( ~) m
  302.     " x) t# x4 z+ x, w) ]
  303.     #获取图片名( G& h- R' k9 _4 u6 B1 P
  304.     def getname(self,url):
    7 w' x$ M( N4 X- i
  305.         name=url.split("/")[-1].split(".")[0]$ D" G6 \- g$ ~$ Q# `
  306.         return name
复制代码

' @& U5 N3 V! x' l% C

) F$ q+ v9 P# _/ S+ {% ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-9-20 01:40

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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