找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!; c6 B/ g% u/ b3 ~5 {
  1. #!/usr/bin/env python
    # V" A& }6 b% Z6 Z" G0 D
  2. # -*- encoding: utf-8 -*-
    4 \/ g. m; f& _1 d# l0 ]  d
  3. # Created on 2019-05-05 21:43:11
    . n* S  `' Q  G. M
  4. # Project: XiaoShuo  v: I2 j5 l, H9 C

  5. ( e% S2 w: G6 p- V6 w
  6. from pyspider.libs.base_handler import *
    9 u% J* M9 v  ]+ i) N2 t: }# r/ o7 _
  7. import pymysql
    & G# u% o2 B* Y2 p4 l$ h
  8. import random
    1 |4 ]' ~# P- T
  9. import datetime# G) @$ A6 y. ?1 D4 G2 }
  10. import urllib2,HTMLParser,re
    ' Q! E# h8 U+ M  ]
  11. import os
    7 l, D# @9 C1 Y# h
  12. import sys% s  n. k$ h0 t$ T
  13. import re
      H: Q( Q5 d3 W
  14. import codecs, c" L! @7 Y% ]1 v! V* f
  15. import requests1 W% `3 y* R/ Z; ^
  16. import json# H! ^* K' ?. A" ~# h. b8 V2 |5 g

  17. ! N, p! v( [, W9 n) _  I9 W8 O
  18. class Handler(BaseHandler):
    : h* k, N- q$ x
  19.     global Datos( Q, W  v( i8 X! S+ w. |  l% j
  20.     global P_dir    6 }, e6 T- ^1 t
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径) z6 I! o) e: ?  m6 ^  c
  22.     global Datos
    + l# r$ S: H# C1 B  Z4 n
  23.     Datos = {}
    ( t: J  f4 _) _; i" L5 _8 W( a# k1 b1 F
  24.     headers= {
    % N8 \. u1 o0 t" X- e
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    ) \/ @  z" Q/ I% z; k, V, f
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    1 D) d' s4 w1 b4 m( P; e$ r
  27.     'Accept-Language':'zh-CN,zh;q=0.8',4 y2 @9 v/ S, j& c% ?
  28.     'Cache-Control':'max-age=0',6 s# g# c( W6 y6 \/ Z' X: u
  29.     'Connection':'keep-alive',: s" ~' k% U. I/ s" e+ C. L. l' L" 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'( e9 Q  P6 V7 {( u/ z
  31.     }
    2 n4 p+ G& G/ D8 \! C% W
  32.     crawl_config = {
    4 E) o# m4 Y2 ~& P% Z3 Q
  33.         'headers' : headers,8 d7 t7 S# n9 t& t& }: }0 ]) R
  34.         'timeout' : 300
    - @4 H9 e; p9 F% p2 g
  35.     }
    " e% Z3 s8 L8 K- `7 Q( x( A
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    : S/ l9 Q7 S! h3 ^& a9 e
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    $ ?# Y" T  U9 l+ k" G, y5 b$ N! w
  38.         try:
    " v$ L; N( J  w' Z4 E1 {
  39.             cursor = db.cursor()
    , A; T3 c) {2 R1 X+ K3 X; [+ s
  40.             #注意此处字符串的占位符要加双引号"%s"$ Q$ W$ O- H" x9 u) N" }3 i
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    ' d  w+ n7 V& K! l5 o4 w5 _/ w, |, v
  42. #            print(sql)0 i# j! a% F/ Z& _& p" B
  43.             cursor.execute(sql)
    ( X; I. O/ a9 E) s, O& t* r" p! C
  44.             
    7 n, a( d1 c! ?. k9 F
  45.             #qid = cursor.lastrowid  f, W1 V) x1 P4 B- G
  46.             #print(qid)
    - K2 B8 U- u5 J6 i( [
  47.             
    1 s. F& S9 Q3 l7 w4 `! L% z
  48.             db.commit()
    & u( W: D: u( d9 f
  49.         except Exception as err:9 U6 I4 V0 o# \
  50.             print("Error %s for execute sql: %s" % (err, sql))
    " d/ v& M1 Z- H, {& F# Q& b% @$ u
  51.             db.rollback()
    7 q7 w( d. F( a5 j% Q* J
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    9 u. K* r" \2 j) s0 t; b# [1 t9 }
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    4 C7 _& G: F% J1 @" S) e
  54.         try:
    ) a$ I, ~: v7 i, g; R
  55.             cursor = db.cursor()
    $ q* e# J$ R% g
  56.             #注意此处字符串的占位符要加双引号"%s"
    ' k4 F0 W' h0 m, Q% W
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    " x  Y) b2 c* c
  58. #            print(sql)
    / w* w" C; L! q7 ~/ ?
  59.             cursor.execute(sql)4 h# _9 ^* ]! d& _$ l) P
  60.             
    + N; U& ]8 y8 s( y
  61.             #qid = cursor.lastrowid
    + I" f  j" X# s, L) w  v" R" p
  62.             #print(qid)* m+ O- k- }0 R7 q( {
  63.             
    1 ]  S2 c2 f, c/ E. A4 ~
  64.             db.commit()
    $ ~4 Z3 o# [) U; v+ A0 X
  65.         except Exception as err:
    & O, j* A$ D. D, N6 Q" V3 m6 H8 H
  66.             print("Error %s for execute sql: %s" % (err, sql)); D- I  G/ V6 \0 U% C
  67.             db.rollback()9 @+ |$ o- X4 k' g: A! ~
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
    ) J3 v' W9 |4 G' r: ~1 K+ z/ W! j
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    + p8 ~+ w/ m& H
  70.         try:
    . u. o! Z" J. d6 O- n
  71.             cursor = db.cursor(); R9 o' H; J6 ~% H
  72.             #注意此处字符串的占位符要加双引号"%s"
    . x( r9 b8 z* `* E
  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);! s  s7 A! Q3 t# i
  74.             print(sql)5 v+ P8 H* H. e8 x5 {
  75.             cursor.execute(sql): W9 f& l+ r# R0 v
  76.             print(cursor.lastrowid)
    ' n4 p4 M3 x# @& S
  77.             db.commit(), a( n. }+ d  ^$ q0 n' Q9 K) H3 T. h
  78.         except Exception as err:
    $ ^) S2 E2 V% O7 u7 e) i9 p
  79. #        except:
    & m/ S- R3 ?# x, U1 U4 d
  80. #            print('Failed')
    7 T0 n/ y9 \# s: [7 O5 i$ j
  81.             print("Error %s for execute sql: %s" % (err, sql)): O7 W" L! E( A) p5 n' _* U
  82.             db.rollback()! t7 _: B, P7 k4 l. _
  83.         3 @* f6 J; m, [, [% K% d
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): * E% Y" N: J3 j: }
  85.             reload(sys)
    0 X+ O0 m, Z$ d$ o/ n
  86.             sys.setdefaultencoding("gbk")
    ; @0 B4 G  e) b0 ^9 S
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址- r+ Q* t% E  B5 D2 H( r4 \# I
  88.             locoy_data = {8 \: V6 n3 |1 l. p$ ^9 {* p! [
  89.             'my_u':'用户名',   #后台用户名
    " `' [, n0 b0 Y% `, I  _
  90.             'my_p':'密码',   #后台密码. L3 f2 g9 f: S& v# i$ `
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),/ P+ q" f' u. c9 ?
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    $ M- D8 U5 J" F
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),: g; ]# ?! g7 [  \, L+ ?
  94.             'article':BookConte.encode('gbk', 'ignore'),  m3 |! V& t5 J: L2 h
  95.             'author':Book_author.encode('gbk', 'ignore'),
    & O, r# v# o, W% `4 k  _9 g; W7 G
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    + l+ w& [/ x: x: L, s
  97.             'thumb':Book_img,8 `" \0 E& z+ G: ^' L
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),/ O0 ]! R7 W) P: F" p. E3 ?
  99.             'abover':abover.encode('gbk', 'ignore')           
    ' i! X: s& F  c; v
  100.                 }# q0 z( v8 O7 n% I' ]
  101.             res = requests.post(locoy_url, data=locoy_data)
    , ~. Z* O3 K; \9 y
  102.             print res.text7 p( w6 g- S, V% n1 d9 I: G) v5 ~
  103.             print res.content
    9 w: V8 i! }. W/ [* Q
  104. #            print Dsd- @7 t5 S. o; D; W, p+ R+ B" L9 ^
  105.             return res
    # `+ |. S: e& g5 q8 E
  106.     . B" [: D+ `2 U6 j: K& p* T! W
  107.     def __init__(self):
    2 B* ?6 k# O% d5 g) ^- V& l$ [
  108.         self.base_url1 = 'https://www.****.cc/'/ ]/ F/ F" i+ `( |: v& G
  109.         self.base_url2 = '/'
    8 p* @, F& E$ l: E
  110.         self.CaterId = []3 i, F: g/ `% k' j, C$ M& ^
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    # n9 j0 A3 G0 G& @$ p/ ?$ h* @$ G1 `% \
  112.         self.page_num = 1( Q2 \2 ?$ `, m* b( b& c  B: b
  113.         self.total_num = 200   0 o8 s; X6 V8 z% G" c
  114. 8 a0 y+ W$ \1 b
  115.     @every(minutes=8 * 60)
    1 d# |, d3 S7 o- S- Q: [9 p
  116.     def on_start(self):
    ' ^' S, O; a8 L
  117.         global Cater_Name' }0 t/ T1 e0 D- j) \! K
  118.         Cater_Name = []- g, M7 k$ I1 U1 v
  119.         while self.page_num <= self.total_num: 9 {: K. X0 D+ _5 {. c& _
  120.             for self.CaterId in self.CaterIds:
    3 V4 C8 U) U) ~7 ?$ \  y
  121.                 if self.CaterId  == 'xuanhuan':
    8 p9 |! H% H( Q0 p# @
  122.                      Cater_Name = '玄幻'* p( n0 M9 X2 G3 B# [+ j: Z0 [
  123.                 if self.CaterId  == 'wuxia':
    4 G4 X0 p: R- N  G; w% A3 }7 Z
  124.                     Cater_Name = '武侠'
    9 C) x( F* E, l- N% g+ s9 L
  125.                 if self.CaterId  == 'lishi':3 d( x: a9 j" F7 x. K* ~3 ~  j
  126.                     Cater_Name = '历史'            4 P, z* s% {7 s6 d: n: ^5 ^  u- b
  127.                 if self.CaterId  == 'yanqing':1 |) U. U! t# }9 ]! X7 F2 `
  128.                     Cater_Name = '都市' % n4 B: V# B9 O6 {" O
  129.                 if self.CaterId  == 'nvsheng':3 G! Y2 ]- Q6 |! Z
  130.                     Cater_Name = '都市'
    : n* s$ Y! n) A' y, ?6 n( A- D" c# e  q
  131.                 if self.CaterId  == 'kehuan':: ~1 v% b& K; w- u
  132.                     Cater_Name = '科幻'
    ! }* M! Z: c! ~
  133.                 if self.CaterId  == 'kongbu':. _, W+ J9 K2 H
  134.                     Cater_Name = '游戏' 3 D9 P" @% Y. N, @. W& P( d
  135.                 print self.CaterId6 @5 Z, j: e0 R
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    ; ?1 @7 b, L9 |2 h% s
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    / o6 Y' Q- r- I" Q2 y0 ]8 [
  138.             self.page_num += 1
    ) C6 A7 M3 j* v8 H) N5 b& h, K
  139.             3 m8 e' T7 R. W  u
  140.     def list_Caterg(self, response):
    ! c5 _& E1 j3 o' M! k% S
  141.         Cater_Name = response.save% z# L5 j# [% ~- o, s
  142.         for each in response.doc('.pic-list a[href^="http"]').items():7 F+ \& l& p2 `0 {) p: \  K: t
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    4 Z: }8 F$ f) j; S* s, P
  144.             7 E2 u! W$ U& R' @. J" @6 e
  145.     def list_Caterg_detail(self, response):! Y; y- I: B" v* A& h
  146.         Cater_Name = response.save& Y) r7 @1 G1 `
  147. #        print Cater_Name4 e! u! c2 f* N. Q+ T4 x0 n
  148.         Bookname = response.doc('h1').text()
    ; a  N* R. Y6 s* j
  149.         print Bookname
    * X4 Q* r0 D6 Q1 U" e5 d
  150.         Book_author = response.doc('.authorname > a').text()9 t* S  f  G8 t: D( G
  151. #        print Book_author
    ' y+ `9 V+ S0 ?0 i
  152.         Book_Introduction = response.doc('.book-intro > div').text()/ R9 A; W$ B3 n+ m0 _2 H
  153. #        print Book_Introduction! P2 A1 d2 ]+ f
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    # Z7 U) j* W& i3 T+ T( w  t
  155. #        print Book_Synopsis
    " v2 C" k' z* l5 N) v
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]1 u, G  }7 a2 K1 j+ t' X
  157. #        print Book_Palabras. D7 q" a  c$ R9 S3 U) j
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    + i( d3 a6 F- o# h. K' p2 k- ?
  159. #        print BookIDs- \% {/ D' _" \/ a8 W
  160.         Book_Dates = str(datetime.datetime.now())         
    0 C- @( f/ \* Z
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    ; L( \7 l7 W) Z1 g" ]8 a
  162.             img = imgs.attr.src
    . D8 d* b! ]/ }1 {* v4 l6 r! G
  163.             print img
    7 t) `: H6 B! Q  c2 e/ J; ?9 X
  164.                 #小说封面下载
    , Y9 w* p  g9 R+ O1 o) |
  165.             extension = self.getExtension(img)
    , [1 n: n' P: H5 @( n1 {0 E) _
  166.             name = self.getname(img)
    1 S) ]; A& p- p% a4 k. y: V9 [/ e' P$ f* k
  167.             file_name = name + "." + extension
    , z' g, D  V1 X) s
  168.             imgDir = P_dir + name6 x. X) M3 L, w9 N1 n% t
  169.             Locaimg = imgDir + "/" + file_name) \8 n& b4 z6 P: ?" o8 @  _5 ?
  170.             print Locaimg
    / n1 r; A; E) |! I: U/ E
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地. `5 i8 P5 X7 ?
  172.                 print('attachment url is ' + img)               #
    . J. G: p6 x5 }" o) [/ o
  173.             Datos = {5 u5 E& {( G+ l7 h. H9 n: S
  174.                     "Cater_Name":Cater_Name,# u- g1 a2 O- I# r, s* F$ r
  175.                     "Book_author":Book_author,
    ) v4 R, P6 V# _
  176.                     "Book_Introduction":Book_Introduction,  [$ F  [* F+ a4 a! t
  177.                     "Book_Synopsis":Book_Synopsis,
      v& U) n: ]% n# ~3 K- O
  178.                     "Book_Palabras":Book_Palabras,
    # G2 o4 V# q& Q# b
  179.                     "img":img,/ N8 V& _4 @# C5 |+ s
  180.                 }) |3 a7 j  z* V7 H5 W, a& R
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布3 d2 b+ C/ C; f/ A' ?$ l# b! f
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    $ u- h! u& Q0 [4 X7 h. H/ i
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    : J3 ^  V- D- U% J, ^
  184.             1 J0 z% k' Z8 J# F, V
  185.     @config(age=8 * 60 * 60)   
    6 O; S. ^. @7 i; |
  186.     def index_page(self, response): 5 ~$ w+ ]  T/ M7 l
  187.         Datos = {
    $ X+ ~* M* k& A0 _# H
  188.                   "Cater_Name":response.save['Cater_Name'],  E+ d) N2 T( Y# N
  189.                    "Book_author":response.save['Book_author'],
    / _2 v$ R1 S; v, w; i( u, {
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    : l4 C$ W; Q, @/ t; M1 n
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    + @4 g4 _+ ~- H  z! O
  192.                    "Book_Palabras":response.save['Book_Palabras'],* U6 J. q7 E8 u& [3 I
  193.                    "img":response.save['img'],+ h3 j# c% r8 D
  194.                      }
    4 X0 ^# @5 K2 j: i; l
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    % h8 Y' V. W+ j( _2 |* h4 V! A
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    ( [3 }1 g  H5 w9 a& O+ \/ Y  }
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    9 c, I& `8 k) S+ f2 I% Y- x
  198.     @config(priority=2)
    : h. R( U" z$ e) Y( Z
  199.     @catch_status_code_error
    5 t5 x1 l$ _4 l+ n6 x
  200.     def detail_page(self, response):        ; O9 Z8 o9 p! h8 n6 S1 x1 J
  201.         NewRe1 = u'哈书'2 U" f& R- i# V; V
  202.         NewRe2 = u'huhjsd.CC'
    - S; Z* H) C7 Y. @* d
  203.         NewRe3 = r'^\\n\\n'
    : ^+ A% e( v2 q2 P
  204.         NewRe5 = u'小说网'$ i% O. l; l& O& G- x* B% b
  205.         NewRe6 = u'fgdfgf'
    * ?, F  M+ L! ~1 x& A" ]
  206.         NewRe7 = u'fgfgf'7 O; f( M7 H: p
  207.         NewRe8 = u'ffhgf'
    / g/ G5 X# s8 B) @3 w) R
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    8 V2 n0 |& T3 b* U. b- P
  209.         ReC1 = u'静思'# `+ {0 u/ u% c
  210.         ReC2 = u'aghgf.com'. t# Z; s" J% n: @
  211.         ReC3 = u'aghgfh.com'
    , `/ c: v3 y5 }- A
  212.         ReC4 = u''
    1 I) D: K  \1 N7 D( D
  213.         ReC5 = u'文学网') a" i8 W3 h- c& w, j. R
  214.         ReC6 = r'<BR>'
    2 ~$ r7 _! b. f% y! v# [# f# \+ v
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称: d. x8 }' y+ @2 a/ ?4 V
  216.         print Bookname. m+ M2 m* L2 b. k  R# ~) M% ~
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    * M7 e! |3 k" \4 S( R  E9 G& ?
  218.         Book_author = response.save['Book_author']   #小说作者9 F, T: R- k) K& P  Z
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介2 {$ ]/ t2 l- K# o, H( _
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
    # }9 c( ?, ]7 s4 K
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数) D$ b1 d  \& f6 g& T* x
  222.         Bookurl = response.url   #小说网址
    8 w+ S/ F/ ^# K; [# O) p
  223.         Booktitle = response.doc('.article-title').text()   #章节名称/ L) |9 y7 P' B' Y' d: b
  224.         BookID = response.doc('.readset-r span').text()   #小说ID4 [& S6 `( n, M+ T
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容2 B. u) t  n3 r
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)7 H4 a7 @: Z6 M0 _- L) C! L
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    2 h  n/ E/ Q2 U! j/ A
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)& e: M8 `6 H4 Y( I* }- o
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    : H' U* n, E. ?% B: E
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    ; p& a. t. t, h, F2 a( x- f
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    + A5 j" j0 m8 f0 X9 j) ?! q
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    * z9 D. }, h4 L4 f
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6), p: Z0 j$ F8 v- g" f2 ?# I- ]
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)( }" o# r7 N* _. Y+ q
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    7 t) C/ B5 F& q, D  ?% K  s2 B
  236.         print BookConte
      R% B# E2 m* S. \% w; p# x% K1 V1 C
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)8 @7 J" T, ]7 D1 s9 N
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)6 K' B$ k$ p1 W6 o1 r
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)2 j1 p$ {( @5 k+ O( ~$ p
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4), y: D0 d/ t8 f' y
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    1 `) W& b0 V6 h, Y  c
  242.         Book_img = response.save['img'],  #小说图片& z8 }3 p/ Z7 ^. y/ U  _/ m
  243.              ; O/ Z; Q0 a8 f7 m3 |
  244.         #insert into MySQL 小说入库$ E' r: t( w& {) G6 i
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布) k" u! y9 k/ _- a4 Q# v% F
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布1 w/ g4 r+ m9 N7 G3 K) i6 i/ M, ^" a4 h% E
  247.         #post提交发布3 Z* Q0 X/ e& u. l, b
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    6 }; B) b+ ]* F( z4 d) |5 R" z% t
  249.         Datos = {& c* e; q7 G; X
  250.                   "Cater_Name":response.save['Cater_Name'],
    2 m1 P. M6 S* E4 C8 x- S
  251.                    "Book_author":response.save['Book_author'],0 u! |2 c% b% H: @- X7 B1 ?. N
  252.                    "Book_Introduction":response.save['Book_Introduction'],5 Z' Z! V$ q: _
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],8 ]+ f- a: X( Y% S9 {& h- @
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    2 d5 |) z* e! U/ v  \) w5 b2 a$ D
  255.                    "img":response.save['img'],
    / H% }2 i! W& y% q4 N
  256.                      }
    3 K" d+ d8 i- i6 R
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    / C/ e5 @' m2 s# `
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) . I% X5 y6 f) P# }( s
  259.         return {
    % l3 r# u6 I1 L; F
  260.             "Cater_Name":Cater_Name,8 `* [- Q" p( N/ t
  261.             "Bookname":Bookname,
    ( p6 J3 z" Y! t* E/ ?
  262.             "Book_author":Book_author,+ E: P* i1 f" H2 i% z/ y% x* [
  263.             "Book_Introduction":Book_Introduction,* x$ P1 {5 \" ?. i* B
  264.             "Book_Synopsis":Book_Synopsis,
    . t) s1 Z% L2 a5 R
  265.             "Book_Palabras":Book_Palabras,
      `# {# T/ V: t
  266.             "Book_img":Book_img,' g* N9 r8 \# D* _
  267.             "Bookurl": response.url,7 ?+ R# @% ]9 q: `7 X) u' z
  268.             "Booktitle": Booktitle,
    2 P- {$ c6 w6 @- Y% k$ g" |
  269.             "BookID": BookID,
    ' A/ F! h0 N1 M2 N6 y$ ~
  270.             "BookConte": BookConte,
    ' ~) j( S0 a5 M: n& `1 [8 _
  271.             "Titleid": Titleid,+ b* r. M/ ?/ G9 s, s) x( |
  272.             "abover":abover,
    " b+ M6 e6 h# ~# n: m$ V
  273. #            "Book_Date" = str(datetime.datetime.now()),* O, [4 g0 q6 D' |' H8 x" [
  274.         }
    & V) B: d  z3 O- l7 k; j
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    0 b* c3 ^( y1 x
  276.         if not os.path.exists(imgDir): 7 ]6 E5 N2 [) }! a  n
  277.             os.makedirs(imgDir)# l' H1 n# Y; U. r
  278.         file = imgDir + "/" + file_name
    6 s" R7 ]1 z9 V' P# F' }
  279. #        print file; ?( J4 I3 C1 d9 w' N" i
  280.         f = open(file, 'wb+')! k- c3 C2 q; G5 L7 s
  281.         imag = requests.get(Book_img)
    ( j0 u2 m& }, s  k
  282.         f.write(imag.content)7 Q/ v/ }! T" [8 c4 b
  283.         f.close()
      F( \+ P  u5 ~8 N  x
  284.         #保存图片前
    0 ]/ L/ J# j% X) ~: d* f
  285.     def save_imgs(self,response):; B+ g, |9 R$ S( i
  286.         content = response.content3 j+ _; z+ J$ Y% l# [6 E7 f
  287.         file_name = response.save["file_name"]6 z9 T, ~; M, {: C# J$ t
  288.         imgDir = response.save["imgDir"]
    . x. P2 V& i* T9 F& B: B
  289.         file_path = imgDir + file_name" P7 f: N) X$ o- F( m7 l
  290.         self.save_img(content,imgDir,file_path)8 a; c# C) k1 [2 a4 ]5 b+ L
  291.     #保存图片  j/ Z! s- u$ e1 X+ P
  292.     def save_img(self,content,imgDir,path):
    + H' ~* \! u- i, S6 K' B
  293.         if not os.path.exists(imgDir):                         % d) \3 E" P0 B6 Z  i( I
  294.             os.makedirs(imgDir)
    , r. H9 N- D5 o( [7 M8 R
  295.         f = open(path,"wb" )
    9 t; \% }8 Z: Y8 ~8 `. p
  296.         f.write(content)0 J% U4 l+ A' |$ A; }+ K
  297.         f.close()2 W! Z) ?1 v2 `
  298.     #获取url后缀名$ [4 `& Q4 f, b/ L1 A
  299.     def getExtension(self,url):                           
    $ q* b- S8 {' ^* f  f% Z) t
  300.         extension = url.split(".")[-1]
    1 h+ z8 l) i2 N( q% V7 t2 ~& S
  301.         return extension . o3 K" V( k$ d( T; Q. e3 F
  302.     - L- i3 P) n9 M1 e* W6 z- H- h3 g7 A
  303.     #获取图片名( {7 J( ]5 U$ p; \3 W
  304.     def getname(self,url):: d/ T2 a7 R3 C# M2 o7 w. Y
  305.         name=url.split("/")[-1].split(".")[0]
    ( H# o! `  E* y/ {. q' X
  306.         return name
复制代码

9 f8 r7 W5 e8 s1 u) B% j/ m8 l

( }/ X0 k' J+ Y" H. Z4 h0 q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-2 11:14

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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