找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
1 [8 h; t9 G" H) S: P; R& u  O
  1. #!/usr/bin/env python
    ; O4 h+ X+ i/ u0 b) ^9 l  t8 O
  2. # -*- encoding: utf-8 -*-
    . n  Y1 Z; y7 i+ L6 b3 W
  3. # Created on 2019-05-05 21:43:11
    8 n, I% O0 p( S0 B& T
  4. # Project: XiaoShuo
    . b7 l; F: ~+ B6 n4 J0 e

  5. , q0 Q# C+ b4 o* N; e6 ]
  6. from pyspider.libs.base_handler import *' F, e6 g$ m# j; X" Q/ R
  7. import pymysql
    ) v; ^- I% B1 n4 _, g
  8. import random
    ; E& g# [4 c/ M7 p. c
  9. import datetime
    ) L" R; v# Y' R- k1 T7 ?! o
  10. import urllib2,HTMLParser,re$ J! U8 `- l1 d% l5 K; ]9 [* ?
  11. import os
    3 k' e; w& `+ G& @" B
  12. import sys$ r0 Y6 M2 Q: O7 h! q
  13. import re& _# J5 P% M% G' S( [2 C. `" ^6 u
  14. import codecs
    1 I/ h& x' j  |0 H9 W# z
  15. import requests
    / Z( G4 G# m, J* d8 A# n4 P
  16. import json
    4 C. ?9 a/ a; B# }" ?

  17. 1 G, M- b* f3 s% w# z" z; n" S
  18. class Handler(BaseHandler):
    , V# H# P; F: v$ {$ g
  19.     global Datos' q* a1 ~; N- I. R6 g* g
  20.     global P_dir   
    ! [  b/ n% d; g- L( C% s# _4 J
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    . d) m  `& R& M% m
  22.     global Datos8 l! {3 ?" e# q" P9 N
  23.     Datos = {}
    ' h3 a3 B; W6 L$ [; n/ q
  24.     headers= {) V8 v4 |9 D1 v* w. C# `$ u
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',: W! K. z. y9 {  C% l
  26.     'Accept-Encoding':'gzip, deflate, sdch',: }5 M9 d& K. z( l) w
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    4 x9 C4 R. F* t& i) O" t
  28.     'Cache-Control':'max-age=0',
    7 R5 V% w/ O- I: B1 p
  29.     'Connection':'keep-alive',
    + \6 E7 V, i, }% ~+ Q$ G$ f* 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'
      ]4 M' ]3 Q! ?
  31.     }6 Z* q; `' e9 a' I/ ]  r, K7 H
  32.     crawl_config = {
    6 W' `9 @4 z: J3 @/ s
  33.         'headers' : headers,
    0 F0 C9 E* Z5 ^" s/ i
  34.         'timeout' : 300
    9 _* _* k' i) Q
  35.     }
    ) w9 k+ o# o0 ]! r+ X% ]3 u
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    1 _" s+ I/ r5 ~7 m9 R
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")! r) M3 S/ D7 M) s+ Y; m  F: u) o
  38.         try:5 \! O- s# Q* u
  39.             cursor = db.cursor()
    " ?; U1 \" a' b0 J  o5 b3 n& P. K+ V
  40.             #注意此处字符串的占位符要加双引号"%s"
    , c6 j) }$ M5 g6 Z. u: s9 {
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    ' V( B: R0 j8 r5 E
  42. #            print(sql)9 P. m$ e& p/ Q  [% j
  43.             cursor.execute(sql)8 t6 x( q: u# h, G1 X' ~
  44.             ' W" f1 u8 s7 A* S" S! s) ]
  45.             #qid = cursor.lastrowid3 Y1 |) i. j! y$ f' z" k: W
  46.             #print(qid)
    # c8 d% l2 f) f0 w- Y9 E; l8 t
  47.             
    2 V+ u- a3 A0 n+ ^3 B' }! e- x
  48.             db.commit()
    - G  P, g; `6 Q3 R, @; b
  49.         except Exception as err:
    $ B4 b0 |3 q, |# s# ?4 d) @
  50.             print("Error %s for execute sql: %s" % (err, sql))" J' t. V7 Q0 q5 o. M
  51.             db.rollback()3 f% o7 v7 C/ ^% G; {' e
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    8 F: i4 h& _9 p! _5 X  P
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ! [5 X. I9 [# F# L
  54.         try:# {9 ]7 T' j4 G( m4 N! H( y
  55.             cursor = db.cursor()4 s2 S7 g8 w( z0 v* a, g: D
  56.             #注意此处字符串的占位符要加双引号"%s"' }8 L! {' `6 O+ j
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    3 L8 y) H0 Y) P$ z2 G1 Q# L% C! X
  58. #            print(sql)
    & ~: o) b# g7 G' o3 o. M4 @
  59.             cursor.execute(sql)" E( P+ F2 \( L9 y& B( t
  60.             3 L: h' f) i% e- @! i
  61.             #qid = cursor.lastrowid+ c/ e% L* V8 R5 Q" h
  62.             #print(qid)
    " ^7 u/ N5 s( {  J; G
  63.             
    % k* x' Z6 ^; I8 F  @( E. ]8 }
  64.             db.commit()
    2 i% i7 b" {2 b; t. z
  65.         except Exception as err:( Z6 E( U: g" ?. v
  66.             print("Error %s for execute sql: %s" % (err, sql))
    * p6 w* q0 N, U! T- a! [1 v: q5 s
  67.             db.rollback()+ N% ?. i, b/ y+ {3 V5 s( 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):  n( f. \2 m1 i5 Y; \; C, s" ~  j
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")+ n. @; Q& n- W. j
  70.         try:
    , ]. ?9 {0 v$ B6 ^4 n* L3 Q
  71.             cursor = db.cursor()1 C8 f8 s2 h0 E6 G
  72.             #注意此处字符串的占位符要加双引号"%s"
    5 S) Z+ Z( h; E: S, y7 D5 T: {* N
  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);, G3 T) z# e. ~- w1 w0 @
  74.             print(sql)) q+ \5 w3 K# Y, I
  75.             cursor.execute(sql)
    & m1 x" H2 r. c. X
  76.             print(cursor.lastrowid)' n4 }& b  [' \% s7 H1 H
  77.             db.commit()4 p9 B8 a0 A$ s! k: J# y! M1 k
  78.         except Exception as err:
    * R# h' k* @* d8 I5 V* g9 o
  79. #        except:
    - q! }% d0 ~) ]% g* K, g) M/ E
  80. #            print('Failed')
    9 A! S2 F& E  ~6 w- c1 D
  81.             print("Error %s for execute sql: %s" % (err, sql))
    2 i0 V4 `& R; m" @" h
  82.             db.rollback()' b+ X& g8 |  v
  83.         1 o% B) M  u3 A/ d$ x0 v& W
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): ! W' U& R$ G- U* [
  85.             reload(sys)
    7 u; }! F1 `" \1 d
  86.             sys.setdefaultencoding("gbk")
    ; H% k  A" v1 W$ o& Z/ P2 v
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    4 o9 _6 \( @; ~" E; o# }
  88.             locoy_data = {
    5 y4 ?4 F1 ~* B, S
  89.             'my_u':'用户名',   #后台用户名0 o6 |. f5 o; `4 {  l- G" d
  90.             'my_p':'密码',   #后台密码
    : H* ^( M: l, v- ~, Y) \% V
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),* f+ `1 S+ `/ D/ @
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),; f" H; ^1 A. r" B/ u. F( n; {
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    . ?6 A! K+ G" Q2 s
  94.             'article':BookConte.encode('gbk', 'ignore'),7 M0 m' o/ W1 B8 i* p, l
  95.             'author':Book_author.encode('gbk', 'ignore'),, ^2 ~- I& v' O5 p# b/ P9 I
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    " z% I' s4 y  W  d1 p/ [
  97.             'thumb':Book_img,- t1 F0 b+ {/ C! z; M
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),# ~- d) ~5 T! U& k2 A
  99.             'abover':abover.encode('gbk', 'ignore')           
    0 P) `6 z) Z; A: h* K2 R
  100.                 }6 H  i3 d1 i) s1 V
  101.             res = requests.post(locoy_url, data=locoy_data)! E9 D2 l) _- z" ?2 F
  102.             print res.text
    0 R5 k# O) Y$ @1 A' E4 @! L
  103.             print res.content/ ~' M/ h6 B! R3 u0 n" ~
  104. #            print Dsd
    ; R! {6 O8 x; ^
  105.             return res0 q( R; u+ e+ E
  106.     0 Z5 i& z1 {( o: X/ T+ H$ {! K
  107.     def __init__(self):
    : I5 X0 z; E& s
  108.         self.base_url1 = 'https://www.****.cc/'
    8 J: X: M' [3 A! ^  F: E2 |
  109.         self.base_url2 = '/'
      B& o4 _- u4 X8 _
  110.         self.CaterId = []! j$ @- `) t5 \1 v
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']$ ]6 p6 T3 T7 }" R; r
  112.         self.page_num = 1! a2 H( r8 Q! q; M4 G& I
  113.         self.total_num = 200   
    . b% K2 ~+ x0 v$ g/ m9 W

  114. % k& R) Y) h' `5 p; h' d/ ]
  115.     @every(minutes=8 * 60)( p( B$ {0 q1 J5 N+ [
  116.     def on_start(self):1 F2 q3 {1 [: ~
  117.         global Cater_Name, M; o" k. f( E6 m0 V1 c' e
  118.         Cater_Name = []* v2 i5 U( Y6 _" I3 C/ w% U
  119.         while self.page_num <= self.total_num: 8 P4 s' I: `% ~* u% {( N
  120.             for self.CaterId in self.CaterIds:
    % r5 C# }% d. @' v' W1 ?+ Q: b
  121.                 if self.CaterId  == 'xuanhuan':5 S) o9 e1 Z5 E* v& h  B
  122.                      Cater_Name = '玄幻'
    $ K5 C% z  K6 Z( m
  123.                 if self.CaterId  == 'wuxia':
    / ^# a$ [! r2 ^" S' q" ~
  124.                     Cater_Name = '武侠'/ d2 n" |! N: y7 l& E1 B: P
  125.                 if self.CaterId  == 'lishi':3 h# T$ K, O# v2 f% V1 q
  126.                     Cater_Name = '历史'            5 a% X0 T2 |% D. u- M
  127.                 if self.CaterId  == 'yanqing':: G$ A+ l9 j  k3 a( o
  128.                     Cater_Name = '都市'
    4 R" n  W6 _3 R. [7 F; Z
  129.                 if self.CaterId  == 'nvsheng':( j7 o* |) u6 W3 ?6 j
  130.                     Cater_Name = '都市'
    9 O3 s6 s' g4 L0 Y
  131.                 if self.CaterId  == 'kehuan':
    ; R3 z/ |4 B4 d) w
  132.                     Cater_Name = '科幻' 1 [0 l% o9 j4 o5 \9 m2 s
  133.                 if self.CaterId  == 'kongbu':9 l2 s+ J+ ?7 u& ^: L, e5 L
  134.                     Cater_Name = '游戏'
    6 D, z' n7 p) M) a7 D5 [1 D
  135.                 print self.CaterId* Z3 z* O& x% e) C( Y- O  O% \- w
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          # w8 t8 P0 N' K8 u" R: N' }0 S
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    6 ^9 j, o4 A8 @  n& r
  138.             self.page_num += 1 ; h( P7 n3 f* X
  139.             
    # ?" W0 F/ P, Y9 o$ \
  140.     def list_Caterg(self, response):* l! g, X9 @( J; O3 E
  141.         Cater_Name = response.save  i, ~8 F3 C+ ^, l
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    / C8 K( _' d- M5 c# P% U
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)5 h( M7 |9 T; k) Q1 F1 o
  144.             5 y7 s( e1 x: j# N; @6 t, R% _
  145.     def list_Caterg_detail(self, response):
    ; T$ g8 Y% m: U! t" [
  146.         Cater_Name = response.save( r2 c1 Z' c# p
  147. #        print Cater_Name+ q/ {9 u) L8 O: ]- |
  148.         Bookname = response.doc('h1').text()+ V& d' X' s8 r8 p
  149.         print Bookname
    ( ^7 T4 ~" v+ H& H9 j
  150.         Book_author = response.doc('.authorname > a').text()& S1 w4 w3 P# G" a  s4 ]- H
  151. #        print Book_author6 U. w# p4 L5 o3 E" b
  152.         Book_Introduction = response.doc('.book-intro > div').text(); a8 T9 y' }: a8 b
  153. #        print Book_Introduction
    : F; |3 z* c# l. B3 X
  154.         Book_Synopsis = response.doc('b').eq(1).text()! x6 I* k. ?. @3 h
  155. #        print Book_Synopsis
    9 M4 k0 h3 A* s$ F
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    2 A7 B! X/ E- }$ [# J0 w- p" ~: e
  157. #        print Book_Palabras
    # D8 X1 {; x, }) j, B- `0 e: J1 t
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    6 Z& r3 {1 o3 i2 C4 ~: [
  159. #        print BookIDs; f- M8 A- n' [  C' m; `
  160.         Book_Dates = str(datetime.datetime.now())         
    $ ~  H$ Z1 V6 P' E
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():) Q( q/ [! g: n. E# S# [
  162.             img = imgs.attr.src
    ) J& q9 n; _% J8 w
  163.             print img3 z' m6 }, f/ |. z) }
  164.                 #小说封面下载( d$ K6 S3 y' B  @
  165.             extension = self.getExtension(img)
    # H; B3 A+ @" L  H
  166.             name = self.getname(img)4 S6 Z6 z  N. {* s. F. }) D8 R
  167.             file_name = name + "." + extension
    : \  L9 }" Z4 j3 t9 ~6 h2 a2 F7 c
  168.             imgDir = P_dir + name' j5 S7 L2 f" T1 h% M
  169.             Locaimg = imgDir + "/" + file_name
    ) h1 Q9 E+ g& ~7 H/ W3 n6 R
  170.             print Locaimg
    6 n: |2 Z- R6 ?" Y
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    / `2 m+ M& k( d! ?
  172.                 print('attachment url is ' + img)               #$ _6 o; {- ~9 u3 b' p
  173.             Datos = {
    6 W( }% N6 B0 D: t
  174.                     "Cater_Name":Cater_Name,
    3 h% O. D; P" j1 F
  175.                     "Book_author":Book_author,$ ^; C8 ]  w3 i/ V( J* R
  176.                     "Book_Introduction":Book_Introduction,0 u4 a+ b, n; O( ?( p9 P
  177.                     "Book_Synopsis":Book_Synopsis,0 c- B2 u) \* U: S' a
  178.                     "Book_Palabras":Book_Palabras,
    0 `3 W( T, W, O1 B; u/ B4 \4 {8 O* S
  179.                     "img":img,7 K! p* a4 k9 C, r0 c6 L
  180.                 }8 O, |) S! @7 n, U0 \
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    : I$ \5 z+ M1 ^# l( Z; Z/ w! W5 ~. W3 o
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    5 b8 E; V2 D% H7 A7 Q
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)$ {6 j; j3 Y0 S9 c+ X# l0 R9 ~! G
  184.             ; `9 @: Y6 e5 f9 Z( R( h
  185.     @config(age=8 * 60 * 60)   
    " n5 e& U( r; ]* n# n4 f
  186.     def index_page(self, response):
    2 ]. g* I4 f/ h8 r
  187.         Datos = {  Y: W/ G5 y( ]
  188.                   "Cater_Name":response.save['Cater_Name'],
    ; v+ D9 e0 e  ^
  189.                    "Book_author":response.save['Book_author'],1 W$ Q1 V* Z( @3 Q& h. D
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    $ V/ U' Z4 g7 K) L" l8 }: ^
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ! Q2 j* E. D& w0 Z% {8 T. B
  192.                    "Book_Palabras":response.save['Book_Palabras'],! }" x- e& h6 T  ~, @2 k
  193.                    "img":response.save['img'],/ m3 h# ~' P2 s5 O
  194.                      }: A" i2 |9 B" V) h: U( s
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():4 W8 W. o' W- I9 E
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  ( ^1 Q8 X+ i: N* G. r2 V/ I0 Z
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ) t9 @3 H4 M) o
  198.     @config(priority=2)
    2 B  M2 j( A% _8 `
  199.     @catch_status_code_error
      r% v+ _9 E; h: q! E$ {
  200.     def detail_page(self, response):        * L# L1 E% d; E8 K
  201.         NewRe1 = u'哈书'
    6 E3 |; ^* G+ f- ~" R4 I
  202.         NewRe2 = u'huhjsd.CC'+ i, h  a+ ?" \2 w. @/ G* c
  203.         NewRe3 = r'^\\n\\n'
    ( h5 a) s/ j* W0 ^' r0 d6 G
  204.         NewRe5 = u'小说网'
    4 N* L$ d2 }: F" i3 y
  205.         NewRe6 = u'fgdfgf'
    & K; T+ T& J6 M+ ]
  206.         NewRe7 = u'fgfgf'* T6 I6 u- R! @' b
  207.         NewRe8 = u'ffhgf'0 d4 S& H' n; n& e& Y* Q' s7 L) e6 c, p
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
      e- h- g" F) _
  209.         ReC1 = u'静思'9 F. L1 r+ H* u; u" ^: c
  210.         ReC2 = u'aghgf.com'
    ' ~& A4 I% ?6 `7 b7 I$ N
  211.         ReC3 = u'aghgfh.com'
    6 {: h: g( Z; m' b* P4 x
  212.         ReC4 = u''9 q+ t1 u& b; G9 o) e
  213.         ReC5 = u'文学网'
    - v$ ^" a7 L5 z4 f$ d- w6 ]3 q2 s* Z
  214.         ReC6 = r'<BR>'
    1 L3 V" o4 _, h/ f# O" A
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    5 I2 o$ E1 }8 J7 p! z. j* ^
  216.         print Bookname
    2 d# t- [0 U9 Y9 F
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    1 S4 |5 H# ]# j* Z( y& e
  218.         Book_author = response.save['Book_author']   #小说作者8 T9 d+ ]# c1 K# q  d# z
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    # L! `, E. d' O# V2 d7 ~+ T1 b
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新; Z, u* g) [* Q3 T
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    * k8 m' `5 X" Q: ]8 s6 ~
  222.         Bookurl = response.url   #小说网址7 U( [+ u6 J1 M+ \1 D
  223.         Booktitle = response.doc('.article-title').text()   #章节名称/ f% x  z$ u4 d. U* Q
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    / \$ U! k6 e, i5 j
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    ; `6 t" S$ L2 Z
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成). b2 n- `1 D( D, U; o
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间& Y" h3 o# n7 c4 I
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    - v: W; h" P, P, ^8 i
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)* A5 w3 {2 f, }3 |- g' ~. `
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    , E2 F0 ]# ~* X) S% x9 [: M7 b& Y
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)% q9 ^* S+ ?* N' m6 A
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)9 t4 {5 }5 i) `! s
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)  W, z# W! M6 @- k- J2 U+ p
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    6 v5 T. P: T: d( B- s
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    8 x+ m' X9 z# f2 k9 j
  236.         print BookConte
    # H! Y1 B7 F( [# }( u
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    0 P4 Z% X8 P% l6 |! T$ \
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    # h5 I& e5 Q% i/ S: b  Y# g# S
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)/ ^4 i6 v. }6 f( H3 X$ j
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)& M4 j! [$ N# q6 _) q% O
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    ! o1 B0 @' }! l' v0 y
  242.         Book_img = response.save['img'],  #小说图片
    $ Q  U; J$ p9 i
  243.              1 q1 W* q/ v( M3 m+ C( G) d% P
  244.         #insert into MySQL 小说入库: S3 M- y5 ~, X, I
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    $ v1 b& o# @4 }; A2 d4 g
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    : ^% j9 O2 W7 d' s! I# m
  247.         #post提交发布
    * f- e6 z' ]' P' p9 E5 m
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    - d3 v$ B+ y0 k. m8 O2 m
  249.         Datos = {
    9 W3 C, X5 j) y3 i/ P  D
  250.                   "Cater_Name":response.save['Cater_Name'],
    - d  |" u  Y4 F5 C1 Z9 _
  251.                    "Book_author":response.save['Book_author'],' }  `, ?1 d9 @7 V" ?" p
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    3 Y6 d$ h; g1 I
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],# |  b8 ?2 X  u# j
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    : e* s: T0 |( n
  255.                    "img":response.save['img'],
      W: [: W+ |) D$ |1 c
  256.                      }
    : V9 S8 s2 p7 O& k, u& k6 Q
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():5 d) D: q  o) U9 t6 o5 t) d% R% x
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) ; k8 ?# i9 j9 Q: @- b' r. d
  259.         return {
    7 w9 p5 k8 h# B& m5 H- C/ d
  260.             "Cater_Name":Cater_Name,
    + r$ c5 b1 C6 O3 @
  261.             "Bookname":Bookname,# R2 ?' Q( B1 C1 n8 a# E
  262.             "Book_author":Book_author,
    7 v  }& I  t! C& y
  263.             "Book_Introduction":Book_Introduction,
    9 h/ w6 ~/ p4 `* I' ]1 x
  264.             "Book_Synopsis":Book_Synopsis,
    ! C+ H# R% a& M1 m
  265.             "Book_Palabras":Book_Palabras,9 X, C2 v9 j; ]% G6 y+ `- p+ S6 Q
  266.             "Book_img":Book_img,
    4 [) ^9 `: s7 }( i# I
  267.             "Bookurl": response.url,
    + j( z1 E* J% E! I# D
  268.             "Booktitle": Booktitle,
    5 |1 Q5 f9 X& T& D; R: n
  269.             "BookID": BookID,, t8 j8 `8 c: M/ [$ ~' U4 _
  270.             "BookConte": BookConte,
    * Y4 r. D8 d9 S
  271.             "Titleid": Titleid,
    4 ]$ t# T* ?" r. k  b: s5 p
  272.             "abover":abover,
    ( C! Q" z& l1 Z/ `
  273. #            "Book_Date" = str(datetime.datetime.now())," C/ {  f* r0 z3 G& _
  274.         }
    & u7 }& o# J. ~' u
  275.     def download(self, P_dir, imgDir, file_name, Book_img):4 z# f, ]7 I8 |" X. j, n  J
  276.         if not os.path.exists(imgDir): : S' t" x0 M9 S4 E' t- ^
  277.             os.makedirs(imgDir)
    " `' \6 S" f4 o' f2 [
  278.         file = imgDir + "/" + file_name$ N0 L, d6 q$ K; S+ s- J& E  e
  279. #        print file* f* z8 [+ U, b9 i3 y' L1 N* m
  280.         f = open(file, 'wb+')1 \+ ]1 g9 U& p2 \4 z6 e# k+ e& h
  281.         imag = requests.get(Book_img) " l0 X* b( {( C  t! E/ f! o9 _+ f
  282.         f.write(imag.content)
    6 y5 s+ J. a& q3 L( p! ~: \8 u
  283.         f.close(); R. }, z, {; ?4 l: H
  284.         #保存图片前+ T( ~5 e$ A/ x; \+ L5 L
  285.     def save_imgs(self,response):
    7 u5 V, P5 N  Q0 C0 H
  286.         content = response.content: c+ l3 E# {' f) a
  287.         file_name = response.save["file_name"]4 Z$ z" \: j2 ]+ N* f' f) N2 x
  288.         imgDir = response.save["imgDir"]
    : G6 i; y5 ]9 N1 ~
  289.         file_path = imgDir + file_name
    4 {1 w. W0 o# _. s2 \, u3 V; q
  290.         self.save_img(content,imgDir,file_path)
    6 U6 b4 v  N  |# k
  291.     #保存图片6 S0 R2 B' E* N  f5 B* c
  292.     def save_img(self,content,imgDir,path):& A; y4 m3 w5 A2 N6 y- ]
  293.         if not os.path.exists(imgDir):                         6 u3 p) ~+ s" q& Y# u! N! O
  294.             os.makedirs(imgDir)+ s9 c1 W# d. c% m0 \5 o
  295.         f = open(path,"wb" )
    ) N: Z; P  n2 ?0 c& W; u. T
  296.         f.write(content)
    7 G4 a$ |9 y! t/ ^" K
  297.         f.close()
    9 j" {1 A  I4 X; m! E* v
  298.     #获取url后缀名
    $ y6 W; Q9 I. Y2 s
  299.     def getExtension(self,url):                            : d6 r9 I; M; ~1 b) v5 g% F) V: h
  300.         extension = url.split(".")[-1]0 s( `. Z+ T: f/ J, Z
  301.         return extension 6 Y' z$ [! v$ `2 n( r0 {8 E, }
  302.    
    7 d9 T, ?9 Y: ~6 k  Z" E
  303.     #获取图片名4 W" u$ {/ K# S4 Z8 q
  304.     def getname(self,url):( z0 U% B0 D) i# [- l9 b$ K
  305.         name=url.split("/")[-1].split(".")[0]
    9 s5 ?: f1 b% P4 n
  306.         return name
复制代码

; E9 ~$ f6 ?: \+ Z: g  p
. H: S6 @: m* U
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 19:14

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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