找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!* n4 ?* R  U, {" C; `6 f
  1. #!/usr/bin/env python- F) ^3 q9 }  Q7 a+ F
  2. # -*- encoding: utf-8 -*-
    " l0 D( @$ m  V9 A: ]
  3. # Created on 2019-05-05 21:43:11
    & U* |- }% U4 H
  4. # Project: XiaoShuo0 s8 P" {9 f% X8 P9 E# q+ o# o
  5. ! S; S% P2 s6 P/ D
  6. from pyspider.libs.base_handler import *% }) K# X) d$ G5 f0 A8 A5 Z
  7. import pymysql
    ' v2 t# {% ]7 C! S, B
  8. import random/ r+ _/ `0 H* _2 j) \9 j8 A
  9. import datetime/ a0 Q5 k6 ^" q% T- M2 R
  10. import urllib2,HTMLParser,re9 `* E) C' D8 B% S  ]0 M
  11. import os
    # C5 z+ z& `. c7 G
  12. import sys
    3 n7 ~7 M. W9 f4 ~8 U3 K
  13. import re6 v4 f3 ^6 ?* I4 G) w8 W" p
  14. import codecs
    4 M$ i+ p; Q# ?0 s; g
  15. import requests$ L# j7 K; G; o& ?+ s  H2 _" u
  16. import json, D( W) P+ D# t
  17. 4 w" M5 x6 j' o/ l7 Y. K
  18. class Handler(BaseHandler):
    1 G. m4 g2 q" x
  19.     global Datos- w8 `4 W. }7 G5 [; {& E) r
  20.     global P_dir   
    ; G, \5 l8 q6 ~( x3 _% Q2 r# D
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    ! t$ H6 }4 ?! }7 W
  22.     global Datos
    & ~7 E9 c. x/ W* ^. @$ {
  23.     Datos = {}
    7 l) s9 c7 Y) ^; O- {
  24.     headers= {
    ; k+ B0 N; w' A/ B
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',% w' F% k9 E" W0 F, i5 A) S  K6 h
  26.     'Accept-Encoding':'gzip, deflate, sdch',- r9 {  R, T3 `5 ^! J: b' i
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    & l  B! M# M, n% Y& P* p
  28.     'Cache-Control':'max-age=0',
    9 J) E  i9 a# z
  29.     'Connection':'keep-alive',
    ! @4 {' ]* N; X
  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'5 g' w7 T( N' Q8 C6 ?1 w
  31.     }
    7 g, Y2 D( k8 P  s4 k( y
  32.     crawl_config = {
    * c- x6 e* J8 t
  33.         'headers' : headers,
    - s1 l  E3 Y6 I- _
  34.         'timeout' : 300
    * e8 s) U# B9 L3 g) ~
  35.     }
    5 m/ B1 p( u, a! A
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):+ U0 O: o! Z4 v$ _
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    & q( u9 q/ s7 W# s
  38.         try:( ?+ G, h* Z0 a. J7 q8 Q* {
  39.             cursor = db.cursor()
    8 A7 l; r7 E3 e3 j1 d" a6 \
  40.             #注意此处字符串的占位符要加双引号"%s": v3 P% o$ K" f, v- ]4 O1 r
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);9 G* T: Y" ?5 \% k0 E. n
  42. #            print(sql): r- z4 \! c! W: J4 j6 |
  43.             cursor.execute(sql)! Z" M9 k, M" i& b4 j, g2 ]' y
  44.             
    / `3 G9 A5 \0 {& O+ Y7 r" R
  45.             #qid = cursor.lastrowid& k: ?( {+ ~2 |- D% P* Q
  46.             #print(qid)* K- L1 F% O. d5 U& K$ M
  47.             5 N9 K+ s0 L, C6 `+ q/ x
  48.             db.commit()0 j' A6 X9 F- |: r' j
  49.         except Exception as err:- Y! T+ P2 M4 r$ a8 @7 n
  50.             print("Error %s for execute sql: %s" % (err, sql))& G9 f; i1 Q9 U4 q3 n! B
  51.             db.rollback()
    " b1 h& }0 S4 ]+ p$ U
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):, a! ~/ c; h4 S+ t- }
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")4 M; X8 U# c6 r* m7 L. F2 i- Y! Q
  54.         try:, d& F5 D5 z( _- N
  55.             cursor = db.cursor()
    5 Q" L4 O5 {; }' w7 R
  56.             #注意此处字符串的占位符要加双引号"%s"; Y  c. L( ]# g  X
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);' v: \( X+ [7 ?; ?2 q# J
  58. #            print(sql)0 ^8 w6 j' ~: |1 V5 e- ]6 g
  59.             cursor.execute(sql)
    6 |" s1 M5 Y3 O7 q) ^
  60.             
    : c4 E2 _7 X6 L8 q  W0 E( L
  61.             #qid = cursor.lastrowid
    1 x: n) p# v# V/ e. y* Q3 t, f
  62.             #print(qid): T7 C5 x8 B5 [* h: D
  63.             ( v7 x9 x8 c) u2 y' P% p
  64.             db.commit()
    ; ?: B" K4 j4 o, c/ e3 w: e
  65.         except Exception as err:
    9 s, d+ S7 G3 Q% y5 U. l( q; _% U
  66.             print("Error %s for execute sql: %s" % (err, sql))
      o, y) E6 j# I
  67.             db.rollback()
      `; W5 b6 r. j. J9 g. O
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):! w. F: O5 X4 M/ v+ }; ~( b
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ) m1 b1 z: c9 b: C$ p
  70.         try:
    7 t" `" r' |+ W( e2 q9 a
  71.             cursor = db.cursor()
    / u5 G. ~6 s' a: C9 r( D
  72.             #注意此处字符串的占位符要加双引号"%s"1 k# U- q/ O6 O
  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);2 d4 i$ t( W* B! v% Z0 U
  74.             print(sql)
    : Q5 B. u+ ^0 L1 F5 {
  75.             cursor.execute(sql)
    6 V% G) l. T6 O$ I* p8 j% z
  76.             print(cursor.lastrowid)
    ! n# k4 `1 Z$ ]: Q3 k$ \6 j
  77.             db.commit()- f% ^7 e; {# U1 f9 P% Y5 [
  78.         except Exception as err:
    7 v8 F) l3 V, n0 d3 @
  79. #        except:* K. ?, U; F3 ~- f. J% \7 n5 J
  80. #            print('Failed')
    $ D. S+ S6 [5 ]7 k3 W
  81.             print("Error %s for execute sql: %s" % (err, sql))$ ]- b% q/ X9 l6 ^4 `
  82.             db.rollback()
    + @: u- p  o( T% M7 J+ [3 z
  83.         5 G2 g! z2 Y$ \, D2 h
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    5 @" X) |( S3 l& t
  85.             reload(sys)1 E/ r( V" c3 b7 P8 }4 M
  86.             sys.setdefaultencoding("gbk")
    % }$ J8 y: J# X3 j
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址' a1 I3 ]  a4 n. r. F
  88.             locoy_data = {
      p% ]; _/ W3 E* y4 V, ~* l% \
  89.             'my_u':'用户名',   #后台用户名4 T' z: q* |/ i+ V) y8 [
  90.             'my_p':'密码',   #后台密码% T! _" h4 ^1 p& S+ C* F2 u& d! h: U
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),( {9 \) D- S, x: A( s
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),# V5 T2 b9 A# F5 K4 @1 b
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    " M$ t+ M, |4 B$ \4 s2 b. r& R$ P
  94.             'article':BookConte.encode('gbk', 'ignore'),
    ( f+ L! _9 h0 l: r
  95.             'author':Book_author.encode('gbk', 'ignore'),! t/ l$ p3 z( H* P3 S- T. F$ T
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),% N" J3 ?- m, \7 C, \- J1 D
  97.             'thumb':Book_img,
    % F! `4 j$ _7 ^2 O" h: m  V
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    ) ~- Y6 x( z8 J3 `( c
  99.             'abover':abover.encode('gbk', 'ignore')           
    # ?8 m- t+ e  s6 g: |$ d; N5 ~
  100.                 }# F: D0 ?/ x1 z" f! s- c
  101.             res = requests.post(locoy_url, data=locoy_data), n- s3 n6 y4 p$ I6 X
  102.             print res.text
    1 f& e3 G0 o9 l0 r7 W2 h9 `1 q
  103.             print res.content. N* |6 I  z- V$ r8 L
  104. #            print Dsd
    # v" N: _5 x, O: `9 i
  105.             return res
    ' w  w1 w2 y5 }% T  A
  106.    
    ; L! }& s/ D5 a- H" e& K) N
  107.     def __init__(self):" O$ r' F9 S; N- e% g3 B
  108.         self.base_url1 = 'https://www.****.cc/'  N7 k( c" b$ l$ M
  109.         self.base_url2 = '/': o' F1 t# Y& h* G6 \4 M
  110.         self.CaterId = []
    * _( K$ ^- _. j- i0 q
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    , y, k& O/ @# l
  112.         self.page_num = 1: C6 \0 T% X) `
  113.         self.total_num = 200   
    ) W) i" J) O5 j. f

  114. $ s- r! ^6 `8 E$ n) ?) o( i
  115.     @every(minutes=8 * 60)7 i: q) E! A1 b
  116.     def on_start(self):. @! `1 j' x1 N& v% x
  117.         global Cater_Name
    $ Y. y( w0 \" z8 A2 F$ U- ?
  118.         Cater_Name = []
    , S; O- J/ a3 P4 {; G
  119.         while self.page_num <= self.total_num: , v# }2 P! \% o8 ?8 O5 A
  120.             for self.CaterId in self.CaterIds:) M+ W- q6 e7 ?5 q# f
  121.                 if self.CaterId  == 'xuanhuan':
    + ], b" r- k$ x1 J7 J
  122.                      Cater_Name = '玄幻'# S+ [/ @- Q- _
  123.                 if self.CaterId  == 'wuxia':9 o6 D& R: E! ^) n5 A
  124.                     Cater_Name = '武侠'$ }% y' K; A# v6 W" y5 p- Q4 ]3 \
  125.                 if self.CaterId  == 'lishi':/ h0 j4 T& |& d1 S
  126.                     Cater_Name = '历史'            
    3 _! ?5 w6 W" m0 c! T
  127.                 if self.CaterId  == 'yanqing':& |. M% L" w4 N+ ^# K1 l' a
  128.                     Cater_Name = '都市' 4 [0 o9 |: J1 q1 X( x# V$ y. G9 S
  129.                 if self.CaterId  == 'nvsheng':- ^! O7 w4 r! O# G2 Z8 O: N
  130.                     Cater_Name = '都市'
    6 I6 J6 G- |  `$ A0 e
  131.                 if self.CaterId  == 'kehuan':# w0 ?! _. E/ E- F) p  t
  132.                     Cater_Name = '科幻' 8 U2 R3 _% t8 E3 a. l
  133.                 if self.CaterId  == 'kongbu':, X6 A: d! K7 K7 u$ |
  134.                     Cater_Name = '游戏'
    $ G0 w$ w9 D! O/ E# d; m
  135.                 print self.CaterId
    0 D# [" U. M- ?
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    ) t! H. s# g( |* r) Z& ~
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)6 f7 }2 g8 a  g& ]* V) ~( t' `' O
  138.             self.page_num += 1
    : U4 D$ c. m, \* n: E: A
  139.             
    1 F2 P" p+ z3 j0 s( p/ |
  140.     def list_Caterg(self, response):
    ( ]4 K% U. J( b
  141.         Cater_Name = response.save
    ; X: l4 t0 `; a
  142.         for each in response.doc('.pic-list a[href^="http"]').items():. [& j. c- H, g% ?) t3 A$ z2 p7 z& Z
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    8 p3 y+ O, T1 m. x% l
  144.             
    ( C5 M$ l/ y8 d. r" B* U. H
  145.     def list_Caterg_detail(self, response):( T# i; @) b0 u% s0 p
  146.         Cater_Name = response.save
    $ b( a* z$ L% ]! ]. c2 {- Z, d
  147. #        print Cater_Name
    ) @) U* f0 q& S5 p1 e7 m7 N2 ?' E
  148.         Bookname = response.doc('h1').text()
      e- t& d) ?2 M: {* V- I
  149.         print Bookname
    " v$ u! ]2 Z& y" R, W0 r* A' O
  150.         Book_author = response.doc('.authorname > a').text()
    ) o; f* r, [; N: j
  151. #        print Book_author. ]+ J8 w% l2 F+ j' }! L0 c# U5 E
  152.         Book_Introduction = response.doc('.book-intro > div').text(): Y, q: J; k7 O/ ?6 y
  153. #        print Book_Introduction
    - ^  p. Z0 p& c2 q- p
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    ' N: _0 t# ]. J$ _9 o0 [/ b; L9 O
  155. #        print Book_Synopsis/ l: D8 D; s! F$ y
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]* I6 ^# l% d" N: ~* y* Q6 L
  157. #        print Book_Palabras+ S- L1 N& i; r9 ^: w
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    # d" v( E1 ]4 P0 D, f% S3 F9 {8 R
  159. #        print BookIDs
    & ?$ I  ?# D! d% {2 q0 t
  160.         Book_Dates = str(datetime.datetime.now())         
    & z* a: |; N$ y6 n" S- s: Z
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    ! a3 x( a1 V; g3 l! D* ?( M+ d6 A
  162.             img = imgs.attr.src
    ; G. l( Z- U$ q% x9 g6 Z
  163.             print img
    . V" H' _  l; A5 M
  164.                 #小说封面下载, l* i/ ?9 b. }5 M5 a
  165.             extension = self.getExtension(img)
    . J0 x* }" U1 N7 Y- a/ a& C- E" y
  166.             name = self.getname(img)  c- D' O- I* d+ y+ G
  167.             file_name = name + "." + extension( i" |# G( F# d3 B6 B. _7 ^
  168.             imgDir = P_dir + name& q- N9 p4 L) T" r* z
  169.             Locaimg = imgDir + "/" + file_name
    , |4 H# W! |$ Z3 }% B6 o
  170.             print Locaimg
    2 I" O, U/ N* r- v
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    ! Y' k4 }  r4 n3 ]
  172.                 print('attachment url is ' + img)               #
    ( m( f8 G2 f* c8 Q- N6 M# Z, _8 w
  173.             Datos = {
    4 A; v6 Y6 Z2 @; z
  174.                     "Cater_Name":Cater_Name,
    3 d( l& E9 u" G. s
  175.                     "Book_author":Book_author,
    . Z, Z$ l9 H' L
  176.                     "Book_Introduction":Book_Introduction,% v, A2 D: P- P7 a8 S
  177.                     "Book_Synopsis":Book_Synopsis,1 m* N/ ]. h8 r  i  V6 f  h
  178.                     "Book_Palabras":Book_Palabras,  ]7 @2 J* P/ l
  179.                     "img":img,
    ( C1 y+ g. I) i5 o& E
  180.                 }
    , O! J9 l5 o' \0 E. k# }
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    ) e% D, ^" J# v' m1 F+ E  [! V( N
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    + ~1 _/ \8 V5 O) L
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos), Q" d. V6 B1 n1 t$ y8 `
  184.             2 d1 o+ f7 m8 |  }0 _
  185.     @config(age=8 * 60 * 60)   
    + e# r  v0 ^, s3 V
  186.     def index_page(self, response):
    ' m/ Z+ r# @& T( U* o) B* v
  187.         Datos = {8 s% z  i. z  \
  188.                   "Cater_Name":response.save['Cater_Name'],
    3 B! T) a& T" r+ ^% X
  189.                    "Book_author":response.save['Book_author'],  e: Z2 Q* ], `  u+ D: u
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    & L% }5 A( s' ~3 T+ n5 P
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    & d9 Z6 \  l: ], R) P" O$ q
  192.                    "Book_Palabras":response.save['Book_Palabras'],: f4 Q* k7 ]5 t" {  `3 W/ O9 h7 k
  193.                    "img":response.save['img'],
    6 s8 M6 ^( p: L. [& V
  194.                      }
    " z) K5 z" S) m" R7 b
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    ( C; H- k$ }) J3 {# L. |
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  - B2 [8 g/ G% T  b* C
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)# b8 \1 `. n0 l* q( z6 M( o, Y, e
  198.     @config(priority=2)8 g/ ^; Q& I. k! ?! K
  199.     @catch_status_code_error& O; N/ x- F4 m- N. }
  200.     def detail_page(self, response):        
    ; o  o9 g4 g& K6 l0 G! U* I: k
  201.         NewRe1 = u'哈书'# s% l1 n+ d' I; m0 _
  202.         NewRe2 = u'huhjsd.CC'
    & [  `) O: K+ ]
  203.         NewRe3 = r'^\\n\\n', E5 e) h; c; @; a
  204.         NewRe5 = u'小说网'
    8 {% U7 A; z! c& P* O  |% F! _  c: q
  205.         NewRe6 = u'fgdfgf'
    ' |! c  E- C9 h- P
  206.         NewRe7 = u'fgfgf'
    ) B3 l; {; {- _7 A" H* s
  207.         NewRe8 = u'ffhgf', d2 c! {3 D/ B
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    9 {4 A$ ]3 I# S2 P9 `/ i' R) Y
  209.         ReC1 = u'静思'6 P1 P$ m6 [/ y, P- m2 l
  210.         ReC2 = u'aghgf.com'
    - t4 C# a  P9 U, `6 H! q* q7 y
  211.         ReC3 = u'aghgfh.com', O* f$ C1 g+ N" {$ W
  212.         ReC4 = u''! ]) G- q2 m  |1 i9 g% \
  213.         ReC5 = u'文学网'+ b. |8 R, @2 I& H$ k, P
  214.         ReC6 = r'<BR>'# {5 f4 C/ S6 V5 v
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    : ^4 [: z! s6 G0 Y" y& j( X) N: f1 ]% w
  216.         print Bookname& {6 _& M1 d( h$ c+ E; U
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    9 y8 H: |+ Q8 [8 u5 K
  218.         Book_author = response.save['Book_author']   #小说作者
    ' `0 m3 i# ?/ _
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介, p' C# U1 N: {8 U
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
    2 |6 X7 G  Q4 _3 Y! h0 \! ]+ T
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数( s2 \/ I2 D( J. J" s  R: g% k
  222.         Bookurl = response.url   #小说网址# v' f$ P1 Y- D5 k
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    1 \/ M! Q4 {3 [: H
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    9 [. Z! c3 i) }. u% l7 W! V
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容2 f/ P5 v" m) {# i
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    / k& r  @+ s. x: Y! k
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间. W* K. @' |" y( C6 a
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    ; s6 L; v- `$ O7 i$ r
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)4 K! {+ s% l; ]6 ~3 c8 x: K* y
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)3 l& R3 U, I# {
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)7 H+ w$ p# [( `0 `# P6 F
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)* f3 A1 ~  t* N+ V; v" z+ ]
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)/ p* M; h+ D* V$ d, O
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)2 r) k$ e/ t  t3 Z/ G7 ^+ L2 g" u1 }
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    & e) ?7 P( a% s* T9 _; L+ G
  236.         print BookConte+ M2 k3 Z0 O$ w# Z
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)5 E" [5 U) Z. E/ B; z9 C
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    0 W' r7 I  i; A/ K+ a2 H
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    3 s6 }! w" s: |. t! l7 h' U6 N* R* _
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    2 |, l+ |; M$ H* F+ ^1 S/ {( }5 N
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     * V& \- r8 T' ?, O% X
  242.         Book_img = response.save['img'],  #小说图片
    - W- F1 u$ f3 w' V
  243.              4 Z& M3 k1 E  I
  244.         #insert into MySQL 小说入库" A6 a, r4 [' L. z% c
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    0 F" ?5 g" [2 O5 q  {
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布4 o- j! s5 h3 T, K1 w
  247.         #post提交发布* o% }3 H1 w) i8 |0 E9 C
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    / f# T1 F# y1 f4 V3 O7 n' i- ]
  249.         Datos = {
    0 k! v! @3 r$ ?" q, Q- G* [
  250.                   "Cater_Name":response.save['Cater_Name'],8 B4 R7 H- d. m% T( a$ J7 p$ t
  251.                    "Book_author":response.save['Book_author'],
    2 {4 c  m; X4 n1 F/ Q' z+ ?+ [& w
  252.                    "Book_Introduction":response.save['Book_Introduction'],$ {$ K7 [9 g" [1 {- R8 l( l/ A+ c. [
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ( C: L! n  ?( W3 \+ F
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    ' o! r; R0 e, D& d7 n* b6 B8 u  b' ]
  255.                    "img":response.save['img'],
    9 d' T8 L, T# P4 ~, y0 T# l
  256.                      }& e* ~- l. w; a- X) Y
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():3 X0 S" d2 _$ w8 h
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) - J8 w' W6 G& }5 l1 X/ e( W$ C
  259.         return {% a0 e  \, m9 K3 U- r
  260.             "Cater_Name":Cater_Name,
    # e! S4 ^8 X/ K' A; j* @/ {" a' A8 f
  261.             "Bookname":Bookname,; {: p2 R& i; ^# P) _) k& c* Y- c
  262.             "Book_author":Book_author,
    0 B7 J; ^% _& A9 x0 i
  263.             "Book_Introduction":Book_Introduction,9 {8 }) }) q) F
  264.             "Book_Synopsis":Book_Synopsis,5 O; Y7 ]) f; D0 t% {
  265.             "Book_Palabras":Book_Palabras,7 o" A& _0 ~) Y9 d
  266.             "Book_img":Book_img,
    : X+ N+ L) S' P
  267.             "Bookurl": response.url,
    * N2 N6 N$ l3 w1 j
  268.             "Booktitle": Booktitle,8 A5 i: N- Y- b' [" `9 Z/ n, V  [
  269.             "BookID": BookID,
    : H1 x! X. y' m$ l7 O  m
  270.             "BookConte": BookConte,; h( x0 G; C2 f
  271.             "Titleid": Titleid,
    " P+ h2 S  ^+ I; @! B; x
  272.             "abover":abover,
    ( T/ I. B. U/ Q/ V5 H
  273. #            "Book_Date" = str(datetime.datetime.now()),
      Y1 o* ~- R- d) B$ `
  274.         }
    8 y! g" J! C+ X4 R
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    * d0 _+ h( T! \6 T' ?5 o2 z
  276.         if not os.path.exists(imgDir): ( n- r& K. ?* n9 d- n
  277.             os.makedirs(imgDir)! l/ u9 G+ }4 k5 J) ~& }
  278.         file = imgDir + "/" + file_name
    0 |' X; u0 p/ Z8 C1 r8 d
  279. #        print file
    ' y9 g" F6 }7 A; o$ c# i
  280.         f = open(file, 'wb+')
    7 o' f6 U% W# ]) c( o9 w
  281.         imag = requests.get(Book_img)
    " ?% c" {- K! _! X; m
  282.         f.write(imag.content)
    9 `8 ]3 i6 f, Q) [# _
  283.         f.close()
    " l  g9 V- U# K" M: Y
  284.         #保存图片前; ]; T, o1 A4 l# X
  285.     def save_imgs(self,response):
    7 v! @8 t* {) ?
  286.         content = response.content% T5 K7 |# u3 }
  287.         file_name = response.save["file_name"]
    ) d4 r5 f9 e( \6 E, d% c
  288.         imgDir = response.save["imgDir"]" }- u; E) I0 T: L
  289.         file_path = imgDir + file_name9 L4 ^7 j5 b! M9 x+ C) R$ b
  290.         self.save_img(content,imgDir,file_path)
    % v* Q- N; b  O( w* z7 Y
  291.     #保存图片) [( L3 H8 O9 H$ [
  292.     def save_img(self,content,imgDir,path):  k5 ~  p/ P! f4 p  u
  293.         if not os.path.exists(imgDir):                         ; i. V3 K* z! N, H; G- u& M1 S
  294.             os.makedirs(imgDir)2 T$ y7 D) D9 ^3 Q
  295.         f = open(path,"wb" )
    7 U0 K! |  x* O7 B. ^5 _( v- E
  296.         f.write(content)" H# b5 }4 i9 S+ D" ?- N
  297.         f.close()+ _9 b7 P' U0 X$ X  v
  298.     #获取url后缀名
    - j( O! }, d7 z8 V9 o
  299.     def getExtension(self,url):                            9 {  S2 A8 f0 o6 U
  300.         extension = url.split(".")[-1]
    & [/ {0 B& \- s, u
  301.         return extension
      ~" i. a( [1 G: Z7 v  G* Q
  302.    
    # f  O9 f4 o. d! b* o4 N
  303.     #获取图片名
    % x4 {' U" m: ~* p+ S) s' U8 v
  304.     def getname(self,url):- s2 w' |" D- c+ ~3 ^( X
  305.         name=url.split("/")[-1].split(".")[0]" A) J6 E8 e! x/ P+ k# V0 f! B4 j
  306.         return name
复制代码

/ N& p0 q- [7 B3 T% e. r6 r
. u7 M% r/ T) B+ R2 ~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-19 06:30

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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