找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
9 x8 K' L) ^6 N5 a3 _, Q
  1. #!/usr/bin/env python4 X# y& T3 [  ~1 F  ]$ r
  2. # -*- encoding: utf-8 -*-: b# }, ]1 j* W1 P( \% ?2 B" Y
  3. # Created on 2019-05-05 21:43:11- k5 J% B7 X/ N" |5 g
  4. # Project: XiaoShuo" c/ t) _; d) g* G* \0 L) s
  5. 7 b. W2 m7 N0 A* [4 R3 O# f
  6. from pyspider.libs.base_handler import *
      H. D: {/ U: T% C# A4 ~
  7. import pymysql
    ; H: {( n/ l$ R4 q
  8. import random
    $ w+ }: x' q1 W) W, D# p! d
  9. import datetime" R: w: G$ F4 X5 p; w; I
  10. import urllib2,HTMLParser,re
    5 D( p' O. B( z& J
  11. import os
    ; `5 P6 b( b$ m7 p
  12. import sys7 Y3 M) U8 U7 }' V
  13. import re- c2 [$ P% ^6 H$ l( P
  14. import codecs
    3 X, ~" ~. @- ~! y
  15. import requests
    ) h" V0 p9 R6 q( e+ p
  16. import json4 Y2 V8 n) l, w0 D0 [6 T
  17. 9 h2 K2 ?) G& e* R9 e: T$ p3 ?
  18. class Handler(BaseHandler):, i0 g% x% L# [9 _* l
  19.     global Datos
    ; k- b, u4 W( f3 }8 y
  20.     global P_dir   
    ( ], q; L1 U" T
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径( b* b0 C. e& n+ o2 S1 T- L
  22.     global Datos
    - X) }, S; H% _+ R  C
  23.     Datos = {}
    + L- I# j: w- N
  24.     headers= {! ]$ U# A) @/ z' \* Q
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    : M) v) S; j3 x- @
  26.     'Accept-Encoding':'gzip, deflate, sdch'," Y& y  y5 }/ i# }
  27.     'Accept-Language':'zh-CN,zh;q=0.8',: m8 H6 u; V* C! Y/ U
  28.     'Cache-Control':'max-age=0',
    2 w1 V$ P$ e- ?; Q9 J% d
  29.     'Connection':'keep-alive',
      O# K8 ^& z# G% o
  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'
    # u! \/ }5 a, [1 y# x% E
  31.     }' _6 V) W% W0 E& d3 w- B- A) m0 v
  32.     crawl_config = {
    ; e1 w* w2 ~* ?6 _/ e6 S. x  \, `- v
  33.         'headers' : headers,
    7 t9 g0 |8 k. A9 y$ Z1 z4 g) s
  34.         'timeout' : 300
    / O1 }3 B: S, l) {. B( @$ t2 o  \+ [
  35.     }
    3 G9 l$ V/ {; ~. j; f/ D( t  O/ o
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):( {5 O* a+ o5 y$ q* s- y
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    . D2 ^, |% H  Z5 L5 g3 A# p( |
  38.         try:
    0 u9 h" {0 \8 d7 o) J+ J1 d
  39.             cursor = db.cursor()9 `7 X) I/ f0 i( {7 v5 @* _/ A
  40.             #注意此处字符串的占位符要加双引号"%s"5 X- l# M0 ]/ w* C8 w5 S- ]. t
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);5 W5 ^: y8 @, H1 k& O( D' a: q4 C
  42. #            print(sql)
    : g; F' }8 U+ V7 B) ~) l% g
  43.             cursor.execute(sql)
    4 V& W6 j: e. Q  M0 P
  44.             5 `4 g7 U7 m3 T0 X6 x( @! a
  45.             #qid = cursor.lastrowid0 l' b6 u2 [5 f6 ~# w& y# g) p
  46.             #print(qid)
    5 ]" P* F! o0 E: ?% S! Q
  47.             4 k, [1 P. \( y5 U
  48.             db.commit(), a9 K0 E9 s' T. D' L; X0 l! @7 H
  49.         except Exception as err:5 d+ {. s/ x( b! Y
  50.             print("Error %s for execute sql: %s" % (err, sql))4 B6 F' t$ J3 v* @
  51.             db.rollback()
    : a( `$ w9 R2 `
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    # t# j7 `' a% U, p6 H( Z
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")3 i/ r) \/ B$ V! V9 \5 v. q& i9 Z
  54.         try:
    . E* g/ g6 e3 v3 O) U; p9 L* z
  55.             cursor = db.cursor()* ~7 m2 g8 K+ d/ J4 ^/ T
  56.             #注意此处字符串的占位符要加双引号"%s"
    + Y8 t9 B8 _( r! Q. k3 b
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);& b4 f) g0 Z+ F0 }  p* F' O, _: x
  58. #            print(sql)
    2 r1 o& j& k8 o  T3 z' m
  59.             cursor.execute(sql)
    , j2 [  ?2 x; K+ |. P& ]) m
  60.             8 D) E+ N1 T; W" i) d2 B+ t# Y
  61.             #qid = cursor.lastrowid
    ; Q4 k2 ^* i: V# k( ^
  62.             #print(qid)
    ( H, }6 W4 E% E3 A
  63.             
    ; r. w- x5 C) S& s1 O
  64.             db.commit()
    . x$ y; \1 c7 L% l( U
  65.         except Exception as err:0 Q( P* c" b4 Z6 K! Q, n5 l
  66.             print("Error %s for execute sql: %s" % (err, sql))
    8 ~/ {4 w7 m! v$ {
  67.             db.rollback()+ k% \; ^! [+ c  V
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):* j9 Z" V) g  p' L# R+ G
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ' R1 V0 C+ r" V) z- J) H' D
  70.         try:$ V4 M" l4 y0 U( }0 M
  71.             cursor = db.cursor()
    * z8 ^" ]& m3 z9 l
  72.             #注意此处字符串的占位符要加双引号"%s"% x+ q0 l9 I# h5 [! i: }
  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);
    6 i" y( w& H  s+ S4 D+ [; O3 ?% S
  74.             print(sql)
    3 K( w$ o/ a. x  K& [
  75.             cursor.execute(sql)
    6 g8 r; a5 T/ l! y1 S, {/ R( K
  76.             print(cursor.lastrowid)
    5 w2 F) d; j6 e0 V1 W4 `: e7 g; c
  77.             db.commit()
    4 k! P) D* r3 t0 G( G( y4 G
  78.         except Exception as err:
    1 q. J! N! b; ~6 o- S5 |8 C
  79. #        except:
    . b8 G6 M1 ]! Y& b- l/ R1 u
  80. #            print('Failed')
    6 U# x- g( e0 ^: T" J
  81.             print("Error %s for execute sql: %s" % (err, sql))) Q% S, |* O" A
  82.             db.rollback()  J' h: q- b1 \) b+ j
  83.         & j& v* V. }3 v( H& S: p8 C& I
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): # T3 n2 Q& W8 t# H$ `& D1 }
  85.             reload(sys)) M0 P: B2 }0 o# L
  86.             sys.setdefaultencoding("gbk")) d/ D2 }/ E/ j, F# e
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    9 G3 O2 x% k+ o2 h
  88.             locoy_data = {/ T6 ^+ [0 n2 `9 J& E
  89.             'my_u':'用户名',   #后台用户名
    0 \1 L/ A1 i& n5 v) Z5 |3 A5 {
  90.             'my_p':'密码',   #后台密码
    : d/ W) D6 i* k) X
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    # K# z' @, f% P8 m' H
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    ) n2 _! D% S# y* K1 ]
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
      m& B0 t8 {. r  w, z4 I9 `
  94.             'article':BookConte.encode('gbk', 'ignore'),* E$ X& u# L4 }+ s( N7 ^
  95.             'author':Book_author.encode('gbk', 'ignore'),0 Y" o, I% t8 K7 p0 v+ f; `
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    $ W; k* N: s* y* T" z* L
  97.             'thumb':Book_img,$ s8 n% n! i$ ?; `4 V
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    % {0 b( p3 H/ _) A' d% o( n
  99.             'abover':abover.encode('gbk', 'ignore')           
    ) B' @- o9 q9 w0 Z- b
  100.                 }
    9 i+ i9 Z/ m0 k) n: M2 a
  101.             res = requests.post(locoy_url, data=locoy_data); c( `  m5 d' u4 u
  102.             print res.text
    $ ^* e% Z$ c$ W2 G1 s
  103.             print res.content
    2 j1 P+ \  h1 E2 Y  e* [
  104. #            print Dsd0 X" Z5 L5 S# v) ^9 |
  105.             return res
    * ]) ]; D1 Z/ b+ I: [9 f. a
  106.     . h- U& [. ^( ^, e6 Q
  107.     def __init__(self):2 R4 l* `0 \! a0 c! b! Q$ x/ T
  108.         self.base_url1 = 'https://www.****.cc/'
    2 r8 V0 E6 j0 M  W% D
  109.         self.base_url2 = '/'
    2 p9 D3 N- t1 s+ f
  110.         self.CaterId = []. H2 z( M; P) o3 d( y) w9 x
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    7 s- u* N( p% H
  112.         self.page_num = 1
    & X/ G8 [6 \7 b
  113.         self.total_num = 200   
    % u5 }; n# z) Q# h8 d8 n" F+ v
  114. 8 y+ u* ]& {  K. `
  115.     @every(minutes=8 * 60)
    3 E1 F+ ]2 A0 d. K- J
  116.     def on_start(self):
    % a/ r$ i- [( O0 V% k0 z* c1 ^
  117.         global Cater_Name
    ; ]* d" t; v: x/ t. z: m+ c
  118.         Cater_Name = []8 S  X% Y8 \' V3 |/ M% o
  119.         while self.page_num <= self.total_num:
    4 K, k# n& o: i8 T- m
  120.             for self.CaterId in self.CaterIds:
    0 r& b- K2 O' L6 H( V# Q
  121.                 if self.CaterId  == 'xuanhuan':- f/ v& j1 M0 D7 @/ \" D* C8 R3 c
  122.                      Cater_Name = '玄幻'+ x  u3 b6 M+ ~6 i) _
  123.                 if self.CaterId  == 'wuxia':$ \; {. [8 f( O  G+ V0 R' b, E8 W
  124.                     Cater_Name = '武侠'; N5 W( [' z: |( W& ?8 {% C
  125.                 if self.CaterId  == 'lishi':
    ' C& E+ s7 S8 a3 k( F1 n
  126.                     Cater_Name = '历史'            
    6 n" F2 `# s5 G! ~6 Y/ A
  127.                 if self.CaterId  == 'yanqing':
    , P; J3 ^8 H' w( Z* l
  128.                     Cater_Name = '都市'
    4 k' V* c6 Z  X1 T3 b3 q6 I# B% u
  129.                 if self.CaterId  == 'nvsheng':
    & c. `4 D  P/ h* A1 U5 U
  130.                     Cater_Name = '都市' & ~  U9 X0 c* @4 @  v- F. D
  131.                 if self.CaterId  == 'kehuan':
    + I0 [* O1 D/ O
  132.                     Cater_Name = '科幻' * v- u$ c3 U/ T$ y: g& W' f- V
  133.                 if self.CaterId  == 'kongbu':, {# Q( V% Y8 \4 l
  134.                     Cater_Name = '游戏'
    # i; T1 B' Z9 F. r$ G, L* a& T
  135.                 print self.CaterId. D1 T$ |4 g8 @! y
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    ( ?1 m/ d' d5 i# e' F; @3 F( [/ g
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)% ]3 R. _% n0 l  Z
  138.             self.page_num += 1 + _3 R5 h- d- [
  139.             
    7 a% l' C  P* ~' [6 f. v! |
  140.     def list_Caterg(self, response):2 z. O; i# G6 T# B& m8 [
  141.         Cater_Name = response.save
    & u7 _% K# a/ B1 Q: c" t
  142.         for each in response.doc('.pic-list a[href^="http"]').items():1 _( l% e1 m& j4 [
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    # I5 S# y1 [% B0 o
  144.             ) b# R0 g7 X- T9 K; N- H
  145.     def list_Caterg_detail(self, response):- i, O+ Q' H$ i5 R6 u  O# d
  146.         Cater_Name = response.save7 k/ [& w; j6 ~) n* i
  147. #        print Cater_Name1 E% z9 P; R" ~" {  |
  148.         Bookname = response.doc('h1').text()3 w* K: f7 y& u3 V! H: R- Q& e
  149.         print Bookname
    / t7 v8 y; ?- ]/ `: z- K
  150.         Book_author = response.doc('.authorname > a').text()
    3 T7 Q( O6 V$ ]' I
  151. #        print Book_author. D. P) @2 }# U' r
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    ' c& s8 n) F  O( p5 E* ]+ |  [3 W
  153. #        print Book_Introduction
    ( N  }8 [5 j5 H# }4 y9 m8 G) Y" C+ o
  154.         Book_Synopsis = response.doc('b').eq(1).text()
      n' l% W/ [* _7 u" H
  155. #        print Book_Synopsis7 V$ Y5 [# l9 H* x  r
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]! W- V' n1 I1 ^
  157. #        print Book_Palabras
    8 l& }. h7 Z0 j
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    , V0 j: N+ e3 J0 @! J7 }- B8 t
  159. #        print BookIDs
    ; f- @" y, ^# P5 ]
  160.         Book_Dates = str(datetime.datetime.now())         # U4 Q, U4 z8 q' K
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    / F0 I( j: c* P+ Q# _$ A  Z
  162.             img = imgs.attr.src
    ' [! x0 {& F/ z5 b. k/ h# t
  163.             print img
    - b4 \4 G1 ]* [; U
  164.                 #小说封面下载' w/ {7 n: g  g9 j  R. g$ u. _
  165.             extension = self.getExtension(img): j! s# E, E  @$ D" o
  166.             name = self.getname(img)+ F- O: D! a# b! T  p, g
  167.             file_name = name + "." + extension
    % I! O, D& Y$ f1 C0 {( J: h  [
  168.             imgDir = P_dir + name
    $ j2 n8 x& N' m% _  }
  169.             Locaimg = imgDir + "/" + file_name
    ) w: g- _- y) |. P( w' C
  170.             print Locaimg
    % S, U  [3 \( ]! \
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    / `0 n* p( V8 z  r% y6 R" v
  172.                 print('attachment url is ' + img)               #
      y2 `4 d7 c' A. ^
  173.             Datos = {
    % f9 o- n1 G2 o6 E/ T5 S& u
  174.                     "Cater_Name":Cater_Name,9 F: |$ Z8 c4 A" O
  175.                     "Book_author":Book_author,
    4 C9 C+ o7 ^, ^" ?
  176.                     "Book_Introduction":Book_Introduction,
    . g" G* l5 `  q4 y
  177.                     "Book_Synopsis":Book_Synopsis,
    ' f6 q; c2 N- Z* E; M: R0 J
  178.                     "Book_Palabras":Book_Palabras,; W$ I3 R+ F: d& f  `4 K! D
  179.                     "img":img,/ P& ?' a1 R1 m& d# a+ C
  180.                 }0 W) m: h1 ~$ h. K* O
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布& q2 d1 k3 Y  k* i. _
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():7 B: O5 {  K% `6 V3 f# N
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    2 A8 |/ Z/ F  E6 T7 p! l9 z
  184.             ( n7 R  g3 \6 a2 [
  185.     @config(age=8 * 60 * 60)    - U3 T5 g2 b1 b1 d* V8 ~1 u
  186.     def index_page(self, response):
    6 a, u# w9 o, o$ Y
  187.         Datos = {
    / I5 B7 a! }  [+ x5 Z
  188.                   "Cater_Name":response.save['Cater_Name'],9 ?; Q! \" W4 k' D: K5 P
  189.                    "Book_author":response.save['Book_author'],
    : S8 L6 ^! O! p' J5 m4 t9 G
  190.                    "Book_Introduction":response.save['Book_Introduction'],/ r% s  K# W9 ^( P& i
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    + f8 Q+ w8 {, e, e5 k
  192.                    "Book_Palabras":response.save['Book_Palabras'],. b6 X  R8 O2 K
  193.                    "img":response.save['img'],
    ! E/ b3 R! U3 b. s) g
  194.                      }
    7 Y& @# P' x* ]1 Z2 M" J
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    9 B: L$ |- k/ F+ J; |4 v
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    ; P) I$ \: ~* L7 {/ {6 U
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)0 z: e* L% Q" A0 \6 ?9 B
  198.     @config(priority=2)
    7 W. o7 s8 _9 A# O$ Q/ z; n. H9 D
  199.     @catch_status_code_error2 o; P! \) h$ x$ {  ?
  200.     def detail_page(self, response):        * c2 U6 N7 I% U- Y
  201.         NewRe1 = u'哈书'8 g* j+ E0 S+ y6 L( G+ Z
  202.         NewRe2 = u'huhjsd.CC'
    $ U* q; o2 ~5 y$ ?7 ~8 c
  203.         NewRe3 = r'^\\n\\n'
    5 u- L# W* a7 W) s. ~' X; a+ a
  204.         NewRe5 = u'小说网'7 D. L6 M0 m: O7 R1 ~$ U: q- l
  205.         NewRe6 = u'fgdfgf'
    / `. Y% F, I2 L
  206.         NewRe7 = u'fgfgf'1 G, A$ r; O; L2 G7 x
  207.         NewRe8 = u'ffhgf'( l: o- \6 j5 x- B. L8 T: Y
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    9 r2 j" B6 M# X
  209.         ReC1 = u'静思'
    ! X6 z: v, @' n3 B) X
  210.         ReC2 = u'aghgf.com'
    * B! f8 O- ~; s
  211.         ReC3 = u'aghgfh.com'
    3 x( ?5 i6 y( J' A/ i+ R
  212.         ReC4 = u''
    ( ^4 A0 j8 W6 i, P
  213.         ReC5 = u'文学网'
    1 c9 j& \, V  v( B) d$ f8 g* r
  214.         ReC6 = r'<BR>'( T3 a$ z' G' N2 m1 I3 r4 e
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    5 o) Z4 E3 l$ _: ?. P- x& a
  216.         print Bookname  g; w" f- q) |* Z6 z1 n: p
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    % G8 o  E9 R9 s; {9 d; I. A
  218.         Book_author = response.save['Book_author']   #小说作者
    ; \" l0 C" a! ]4 H/ Z3 c/ M& B
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
      k. d; @% x; v' v4 }
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新  s+ e) }8 f6 R/ q8 C/ a2 P
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数; p! ]$ o) c+ z' B$ ]- @5 D2 c
  222.         Bookurl = response.url   #小说网址0 C; f" A( g0 @9 A5 W( @5 I- U) _
  223.         Booktitle = response.doc('.article-title').text()   #章节名称# i1 m5 t" |2 r0 m
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    : v$ |1 g( c! W; H7 r* ]" v
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容+ f2 p' i# ]. A, ~8 o7 k$ Q& \
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)) h' s3 G9 Z7 N, j
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    . i9 O  D0 `1 s, z
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    2 {  ^' D6 |$ @# A
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    ( m. F$ N$ M$ b6 d) L1 a2 n( x
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    0 C2 g9 ^8 H4 q! X
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)! P% {* A2 }7 B) y4 W- b
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    ' ]: O+ {$ q; W: ?' P3 B2 M+ J
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    ) P- e; X+ n  {! X5 }. S
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)! n1 P; U3 R  D! Q* F
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    : [- A. B! f* q4 c# l
  236.         print BookConte1 t$ Y% a0 Q& w! H4 C* U7 u, T
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    $ h* R$ |7 |. m3 j* w8 ]# k  t
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    " m- K; o$ k8 M% G. a
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)/ c: J" U4 p" R' A/ j" S( H7 W- x
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    ; Q; ]" V/ R" T5 D
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     8 y0 ^# A- E3 |$ K
  242.         Book_img = response.save['img'],  #小说图片  Q! G! M: S9 _7 v$ q8 m
  243.              - D& [6 `! B# C7 x$ a
  244.         #insert into MySQL 小说入库9 {& w; @$ R; n# p1 r; c$ O
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    # X. I" v& G1 I+ L
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布- ^' e8 `) p* E
  247.         #post提交发布
    5 k: a9 M$ a6 t9 ~
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    ' g( t: X. }( g  L6 P; Z# F( o; Y
  249.         Datos = {
      c+ o# p6 W0 J. O; J
  250.                   "Cater_Name":response.save['Cater_Name'],% S1 ^1 k3 `$ k, m1 h# M8 _: B
  251.                    "Book_author":response.save['Book_author'],
    ; |; Z  M  t% a% G& B' G4 d2 Z- H
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    0 l! C3 a' L' D! z4 t, L5 {
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],, o* K2 i7 P2 V* y  J  u
  254.                    "Book_Palabras":response.save['Book_Palabras'],9 v* ?" c/ H6 P( K+ k
  255.                    "img":response.save['img'],
    4 r3 h/ p0 Z3 G# z
  256.                      }
    4 o/ I, n8 S6 i: c% ?3 o( E/ R
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():4 C6 X, V9 z4 h+ X- @; q5 ^  o
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ( M7 g- q7 R$ x) u* W
  259.         return {
      Z4 N; }# I/ x7 f! e2 C
  260.             "Cater_Name":Cater_Name,
    ' W+ \, K) f. f- q& v
  261.             "Bookname":Bookname,
    1 \1 O" U/ [. c( k3 v: T
  262.             "Book_author":Book_author,. V" t7 r9 i9 I
  263.             "Book_Introduction":Book_Introduction,
    ' X) ]5 X; s: \. L' F, U! @
  264.             "Book_Synopsis":Book_Synopsis,
    + x. U" W: D# |: i
  265.             "Book_Palabras":Book_Palabras,
    5 e5 [7 X6 n- t" B3 l5 ~
  266.             "Book_img":Book_img,
    ) h: ]5 V  K0 D7 q3 v# |* W: x
  267.             "Bookurl": response.url,
    1 N3 k: s; x8 m& I4 U: k+ ?
  268.             "Booktitle": Booktitle,
    " K) w7 |# j8 K. \6 m" q
  269.             "BookID": BookID,
      M5 E9 E3 c8 C; p  f$ N! q
  270.             "BookConte": BookConte,/ B5 ]. T$ m& B! j
  271.             "Titleid": Titleid,
    5 b; M3 |' j4 U; P$ a' B
  272.             "abover":abover,; Y, K8 ]. B( G
  273. #            "Book_Date" = str(datetime.datetime.now()),0 U+ H# ?5 V% |2 @4 C: O
  274.         }% q4 u' L( F1 N5 C
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    3 n$ j8 R1 g  C
  276.         if not os.path.exists(imgDir):
    ' `( t- Y+ @5 r. J  |7 ?4 \
  277.             os.makedirs(imgDir)# J/ T% B; m5 m2 R
  278.         file = imgDir + "/" + file_name
    ' i; Z: E4 t- z5 `/ v3 r
  279. #        print file/ j; |; o- a) ?' U! r
  280.         f = open(file, 'wb+')- m3 h. h  j& x  K& {( Q% T' w2 f
  281.         imag = requests.get(Book_img) ! c: @5 ]' ?# s% s" `
  282.         f.write(imag.content)# e* q' Z! X+ f8 R, [* n
  283.         f.close()& c7 ]) f  ]" u6 m  I, Z. d
  284.         #保存图片前
    : y& a$ E6 P, `* t$ ~2 d2 A1 z
  285.     def save_imgs(self,response):/ V$ N8 d) i( t* b4 ^
  286.         content = response.content
      n* n0 Z9 G' F. e) K
  287.         file_name = response.save["file_name"]5 r4 |" \2 C* Q; t
  288.         imgDir = response.save["imgDir"]' z, D9 S# q/ I) W* i5 T3 }
  289.         file_path = imgDir + file_name
    ' [" l1 {/ _9 P* B% b+ `
  290.         self.save_img(content,imgDir,file_path)
      w0 C$ @) ~' ]; Y$ I* b3 F
  291.     #保存图片
    ) }+ D! H1 i! h8 c
  292.     def save_img(self,content,imgDir,path):& s5 U! r' x0 K  Z$ o
  293.         if not os.path.exists(imgDir):                        
    0 [  n: w# I1 D2 D
  294.             os.makedirs(imgDir)
    . O: T/ o' F5 M# H7 ^8 [
  295.         f = open(path,"wb" )6 R4 C/ ^7 i. k' z1 ~/ F; `
  296.         f.write(content)
    " q2 d$ B* t* ]0 M3 T) L+ P
  297.         f.close()
    / \" J0 G  b/ w) ^7 [
  298.     #获取url后缀名
    & Z: Y9 C3 H3 L1 B+ m8 f
  299.     def getExtension(self,url):                           
    0 Y5 D+ F  @. n6 O; X( K
  300.         extension = url.split(".")[-1]
    2 B2 K) c2 r2 d" K3 w7 o2 ]8 I- _
  301.         return extension . Q. S+ t( G: j7 P4 {" f0 `1 Y
  302.    
    ) |8 s# U/ Z9 S8 R& q
  303.     #获取图片名/ L# k: O' p; u; J7 u
  304.     def getname(self,url):
      s) x" w" G: G7 T% i
  305.         name=url.split("/")[-1].split(".")[0]# J. e6 ?% y, M- W
  306.         return name
复制代码

, @; s, L# M  A3 A, E! B; ~, T
& S6 k& \8 }( E7 S4 v. `9 D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-4-26 06:01

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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