找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!" L3 @3 S1 k% w& x: E  Q  E2 {% \
  1. #!/usr/bin/env python
    : H2 y1 _" T  e  ]
  2. # -*- encoding: utf-8 -*-
    ( l( D! b& E# V; }' b* U' ~
  3. # Created on 2019-05-05 21:43:11. A1 c: R3 q& n
  4. # Project: XiaoShuo
    7 t& k# h7 N# _  u! J

  5. 5 R6 t" s" O; S4 o2 V" `" E4 |3 X- U
  6. from pyspider.libs.base_handler import *3 }0 h5 q- T( \$ D
  7. import pymysql6 J$ @. L( C# `/ ?( w, y
  8. import random$ {3 v  \* V/ z9 [" ?
  9. import datetime
    - V& m4 |+ ^7 o3 B0 g% O
  10. import urllib2,HTMLParser,re+ g. w3 c, T2 P8 B- Y3 @8 ?) R5 r
  11. import os/ K, V8 h5 P0 X( e% u8 i
  12. import sys
    ! w7 A$ f  ?3 s4 N
  13. import re
    1 _! K7 D& s+ P' h
  14. import codecs6 O4 G  [  z2 N  p" x
  15. import requests
    3 j" _3 U! W  j6 n6 D
  16. import json- u3 o. i0 E6 b; `) J# V9 m+ z- w

  17. 4 B, ]6 Z7 |/ P6 n! k
  18. class Handler(BaseHandler):8 c. c% }( D3 R/ j
  19.     global Datos
    4 ~, R5 _! A8 U1 q
  20.     global P_dir   
    - e) {, {- A  j9 h4 E& C
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径5 y/ i9 R/ n6 L- ^" X5 D- N
  22.     global Datos4 L) g5 K8 l2 u3 r# X$ a% c
  23.     Datos = {}
    8 p, y7 q3 t  B2 R* V+ R$ w- R
  24.     headers= {3 j4 l, B- a1 C+ }' L" b! w2 f6 ?* j* t
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',% E1 b" a! E5 s. k
  26.     'Accept-Encoding':'gzip, deflate, sdch',9 }# n5 M+ I+ T; E$ m  o
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    * A+ I+ R3 d) X( v5 l5 N
  28.     'Cache-Control':'max-age=0',% @( Z$ T9 x4 n2 d. q- W9 k) X/ Z& F0 q
  29.     'Connection':'keep-alive',% g& _: l8 ^9 o. p
  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'
    - b  p; H$ g" V  m. |& ]# l
  31.     }$ v! q4 |! K  b6 t4 P* k
  32.     crawl_config = {
    + B6 C  w4 F- h0 S+ g- o. W4 P
  33.         'headers' : headers,
    ( T* |" E; U: V* M1 j
  34.         'timeout' : 300
    : I9 }  V' o: @4 Y1 n& O
  35.     }7 g1 r- G0 e. Q# V
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):8 i1 B$ }; V+ ?# N6 @# r
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")& e, ~% D& D5 ]7 \0 `' e
  38.         try:
    6 A) i7 ]3 _( u9 L$ K+ Q, T
  39.             cursor = db.cursor()* W$ g& B# D+ o' k) O, f
  40.             #注意此处字符串的占位符要加双引号"%s"
    1 I( o4 _. Z: _
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);# i- Q4 }+ R6 ?& O8 t7 B
  42. #            print(sql)
    3 }* W8 @: ^/ _" o
  43.             cursor.execute(sql)
    - P$ K8 `- ~( h
  44.             , X7 A6 ?% R& `4 m2 F
  45.             #qid = cursor.lastrowid3 W) ~. z; S7 d! I" [
  46.             #print(qid)5 R; O1 \, G9 U2 Z. u) U1 M& i
  47.             
    + w" ~5 {/ J- F& y7 L- v: l
  48.             db.commit()& i. f: q' j4 n/ T1 F( O& R
  49.         except Exception as err:
    4 O2 d6 I4 t6 L+ m2 V% |2 i1 T
  50.             print("Error %s for execute sql: %s" % (err, sql))$ l0 d# T; K5 m+ C: Z
  51.             db.rollback()* \/ m7 t1 ?) V% A
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    , N% a/ y2 W1 G7 u
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    / p8 n. |) `7 |& S3 A3 O- u0 L
  54.         try:
    3 }3 d' e8 m. M0 y% H
  55.             cursor = db.cursor()
    9 c  u$ a$ r" Y' P; u
  56.             #注意此处字符串的占位符要加双引号"%s"
    / U. f# d' I4 Z) X( z
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    " t2 J+ X- T/ ?! g/ n
  58. #            print(sql)
    $ |3 Y9 W7 S9 X0 o5 m2 a
  59.             cursor.execute(sql)
    % m3 p& ]6 n* W- R* P5 \
  60.             2 l- o0 q& R* }8 s
  61.             #qid = cursor.lastrowid! J2 d  }& g- j/ `
  62.             #print(qid)
    , s( _% I$ F5 j. V4 M
  63.             
    ' N- i3 y7 P5 B9 |& N
  64.             db.commit()3 m0 `& L, I+ q
  65.         except Exception as err:
    1 S# b" ?+ ~. |+ [0 a! n1 H9 n
  66.             print("Error %s for execute sql: %s" % (err, sql))7 ]7 q) @6 k0 ^
  67.             db.rollback()
    / e0 M6 h- ]' [. U& ~( R) n' u' q
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):+ U5 ~' e- P/ Y( [- I
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    & S0 t! V( n) G2 ^+ ]% W
  70.         try:
    ! Z3 m$ i: G# C7 X0 |1 p& k; {
  71.             cursor = db.cursor()- o5 u8 h$ `( V
  72.             #注意此处字符串的占位符要加双引号"%s"
    ' l8 K: w2 a. q" @$ k
  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);. Q2 D2 v# ^+ Z" T. H* n
  74.             print(sql)
    3 L; k2 v$ Q' m- X, p2 O
  75.             cursor.execute(sql)
    & _. [1 T& s% j7 R3 F& I, u! N7 V4 M
  76.             print(cursor.lastrowid)
    ( m! j: ]. m9 }2 f  B
  77.             db.commit()
    1 a5 I; Z2 v3 Y5 M8 b4 d
  78.         except Exception as err:
    ' e0 B' _2 v1 g9 x
  79. #        except:4 M! o6 V4 f6 y& D5 b+ I. Y6 k
  80. #            print('Failed')
    , V! k' U0 Z' [$ P9 o* b. h& l* \
  81.             print("Error %s for execute sql: %s" % (err, sql))
    - x" F. [: v: `: m
  82.             db.rollback()
    , Y) f) a5 a: x- h$ S& m% S
  83.         ; |: [; q+ \0 Y4 y& B+ F; x1 Z
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    " I$ B- Y+ o& p* v
  85.             reload(sys)! f( p3 r/ m6 b( S7 Y/ ?" H6 P
  86.             sys.setdefaultencoding("gbk")9 E8 P) S+ T9 ^# r9 T/ I
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址. l+ v0 g& p# l  a; ^
  88.             locoy_data = {8 U4 L, e$ A) ?5 t" i
  89.             'my_u':'用户名',   #后台用户名
    7 ]# c1 X; M/ e3 t' s
  90.             'my_p':'密码',   #后台密码
    . a8 Q3 E9 Y  S$ ^/ r- l
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),! t, [! ~/ q! {/ f7 x3 Q% f
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),; B" b' V! \  Q1 L6 z) x2 D
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),6 q4 s/ X4 B1 l* y* R( V4 j
  94.             'article':BookConte.encode('gbk', 'ignore'),9 d& V( D9 w" Y6 w
  95.             'author':Book_author.encode('gbk', 'ignore')," e* E9 B# \0 ^+ K: g8 [
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),: B* E2 ~5 _; d6 {
  97.             'thumb':Book_img,
    ! ?3 l7 k' T8 [0 \+ W# r4 p' O
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    8 ]1 y. r- g* N: j
  99.             'abover':abover.encode('gbk', 'ignore')           0 x# ~  {% }1 j3 D" L# I% f
  100.                 }
    7 d: o* K* o* ~# x7 R" L% E6 t
  101.             res = requests.post(locoy_url, data=locoy_data)
    % r6 N' i. ^2 O/ P" L
  102.             print res.text
    " E) I) ?: A1 X
  103.             print res.content0 x! I* O. D5 ^) t# @: X7 S
  104. #            print Dsd4 w) B8 S7 g$ o
  105.             return res
    - e: J% I1 }$ i2 h, F* K5 p7 n2 {
  106.    
    # ?0 t9 K' |& M" T( v  F. }2 _8 C
  107.     def __init__(self):, S; ~5 `# ^- ^3 z' D: k% n* g
  108.         self.base_url1 = 'https://www.****.cc/'
    4 w8 `. V2 s, g' e8 [& Q
  109.         self.base_url2 = '/'
    8 l  K$ u5 q. F* M! d& A
  110.         self.CaterId = []
    ' D/ l; ~( K, ~( n9 L
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']1 A. e2 r5 t' d! i- _1 b. Z4 O
  112.         self.page_num = 1
    3 Q- D2 s( V1 A" N
  113.         self.total_num = 200   
    7 h" p3 {1 v" D6 D$ D! T2 G

  114. ) `% J) t$ A0 D, l
  115.     @every(minutes=8 * 60)5 `+ m8 z; D5 s% j% ^2 b" b
  116.     def on_start(self):$ y+ d4 z: I& f$ J
  117.         global Cater_Name, Q6 @( J4 B, @' D* `( J5 p+ O+ Z5 p
  118.         Cater_Name = []' b6 |; |# V2 o; h1 i
  119.         while self.page_num <= self.total_num: 7 _2 N1 u( X1 h9 Z* N$ O; ~
  120.             for self.CaterId in self.CaterIds:/ ^$ J  m2 Q7 \/ b* G9 Z( i
  121.                 if self.CaterId  == 'xuanhuan':
    ) X1 ~# `) I/ ]
  122.                      Cater_Name = '玄幻', S/ @, g0 V) M+ D& J5 e% [! i
  123.                 if self.CaterId  == 'wuxia':
    # x8 X: k! l' C8 h+ F
  124.                     Cater_Name = '武侠'
    ( ?$ Q5 m3 w/ y3 O6 v. H7 }
  125.                 if self.CaterId  == 'lishi':
    - @% ]. b# h/ H" T5 ~
  126.                     Cater_Name = '历史'            " Q( v5 }/ r  S/ y& ]! @1 w
  127.                 if self.CaterId  == 'yanqing':- k$ o8 k+ a8 {
  128.                     Cater_Name = '都市' 0 D+ i' u  P0 b
  129.                 if self.CaterId  == 'nvsheng':5 K* d. m9 v; \7 y, F
  130.                     Cater_Name = '都市'
    ) C6 z4 I2 q# n. O! y
  131.                 if self.CaterId  == 'kehuan':0 v* Q* t8 h- O- }" O1 T$ h
  132.                     Cater_Name = '科幻' - s6 m' s; e" D: T- c7 @
  133.                 if self.CaterId  == 'kongbu':
      o" W$ ?/ g2 h9 |. g! u0 \: @) i
  134.                     Cater_Name = '游戏' 1 e$ A8 J0 Z. O) i  K* G0 d
  135.                 print self.CaterId# a! P+ D7 ~- N4 z
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          ) w" c. y: p1 k1 C
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    9 {2 B+ E) h/ ^7 Y* X/ G& ?
  138.             self.page_num += 1 ; I2 k3 K7 k/ }
  139.             * T9 I, T; ?) W/ S1 F5 s/ q7 e
  140.     def list_Caterg(self, response):: I' B, g) ]& |4 c- r2 E! X
  141.         Cater_Name = response.save
    # f+ I$ ?, N) |
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    7 f' Z! z( \0 z; j$ Y+ O. E) M, T$ |
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)3 ]5 c( ~/ ~7 ?8 g, \# i6 a
  144.             
    " Q- b/ h6 V3 m8 }' |# h: h
  145.     def list_Caterg_detail(self, response):
    , `1 a+ s. K9 G  F" s! S+ o/ f
  146.         Cater_Name = response.save
    . C9 ?; h% m6 R/ U( W# I
  147. #        print Cater_Name: H2 D+ E. f- O1 \' J+ z3 [
  148.         Bookname = response.doc('h1').text()
    , Z2 j4 ]3 v1 ]  \1 O2 P8 L+ f' ^* G- u
  149.         print Bookname
      z) J0 u0 a! I( i8 Z* M
  150.         Book_author = response.doc('.authorname > a').text()7 i# G' D$ j  m9 ]' i8 _
  151. #        print Book_author
    - h1 r7 X7 x0 p) Y5 y
  152.         Book_Introduction = response.doc('.book-intro > div').text()- I7 _! M+ V' e
  153. #        print Book_Introduction0 J+ z2 {" s* S* a: H; S
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    3 {" p# o+ G* i) X! [
  155. #        print Book_Synopsis
    # J. [2 z( V: y7 y) _1 M# C
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    ; ~7 B, J9 N5 w2 I$ i" r* \5 @% j
  157. #        print Book_Palabras( D2 e8 i0 ?) S% z1 \
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID# w9 y4 i7 Y, Z) n! k0 g
  159. #        print BookIDs
    0 L" ], e' i) ^2 ?/ q
  160.         Book_Dates = str(datetime.datetime.now())         # c  [/ {& K+ r
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():% R( h6 q$ _2 c+ h' b) J0 E; f" \
  162.             img = imgs.attr.src
    ! Q. d8 J6 w& ]2 m0 v5 }7 l% p
  163.             print img
    1 D' V0 N2 e- n6 L% W0 s8 Q
  164.                 #小说封面下载# w2 [1 W/ r; d4 r9 r0 c
  165.             extension = self.getExtension(img)" }' n, Q( A" g5 f7 t/ `
  166.             name = self.getname(img)
    6 k* p' N/ ]6 Z5 u. x
  167.             file_name = name + "." + extension6 @$ z0 S+ @' }0 L
  168.             imgDir = P_dir + name
    ) G, |: r" |: P( ~; v; b
  169.             Locaimg = imgDir + "/" + file_name/ Y, h3 L' {/ J' X( z& y3 E; j/ K
  170.             print Locaimg9 U  H& W8 Z) X' C5 c
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
      k* q( t/ b. M+ Q& l! M
  172.                 print('attachment url is ' + img)               #) z4 Q/ Y; A1 {5 }
  173.             Datos = {
    ! Z+ M$ F' w- X/ e% o$ @8 g
  174.                     "Cater_Name":Cater_Name,& `( T- e8 `! x# ~, o
  175.                     "Book_author":Book_author,( F3 V) Z3 g1 `, x# A. k7 X; Z
  176.                     "Book_Introduction":Book_Introduction,
    6 b0 x# a% Z) b' d$ K9 K  c. u
  177.                     "Book_Synopsis":Book_Synopsis,
    1 q5 h  ?; z; J  O
  178.                     "Book_Palabras":Book_Palabras,- U1 I/ n( V' d" x7 i* W5 {
  179.                     "img":img,/ j' R! n, ^% ~' ^. P$ g5 }  j
  180.                 }
    , G% A) h- e$ b5 X5 V9 V' l
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    5 z  u* N* O) ]# @. z
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    1 n$ A2 |2 `, ]  v
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    + E; t8 [7 U- L2 {4 d: T
  184.             3 W  L/ Z% P+ E# u2 E. J
  185.     @config(age=8 * 60 * 60)   
    * e% `3 v4 B! e
  186.     def index_page(self, response): ' V7 c/ S% ^* v! `7 \5 m
  187.         Datos = {4 N; ~2 t  \9 P( }
  188.                   "Cater_Name":response.save['Cater_Name'],  a5 t1 O! G  B) S0 u7 V) [8 Q
  189.                    "Book_author":response.save['Book_author'],
    6 |! M( j( Z9 K# h) C
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    / ]0 q7 ^, }* F" H
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    2 F3 s! |* X; y6 T$ Z7 F$ p. r( Y
  192.                    "Book_Palabras":response.save['Book_Palabras'],3 a  c. P" x" H5 T* i4 h0 v2 e8 `" o
  193.                    "img":response.save['img'],
    ) }' m! q; s5 Y1 r/ [" N2 A
  194.                      }
    ! e: F) j6 U( k: \1 B. _- D
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    5 P1 j4 H4 c4 y) p. u+ z# c
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    % M# J$ L9 f# m4 ^. B/ D; C$ Z
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos), R8 ~4 U0 S& c1 T* ~2 w
  198.     @config(priority=2)/ m6 ?* Q# u, d. G: Y0 n" `
  199.     @catch_status_code_error# H: H% W+ U9 _, Q: o7 A
  200.     def detail_page(self, response):        
    & @1 h; d; D) O( V6 Y
  201.         NewRe1 = u'哈书'
    ( c) C) G5 l. i
  202.         NewRe2 = u'huhjsd.CC'. F/ i. A( B% Z7 l. S8 ~& `  W
  203.         NewRe3 = r'^\\n\\n'
    . n* ?* K% s  ~
  204.         NewRe5 = u'小说网') p4 E8 E3 n3 I3 {  }: N
  205.         NewRe6 = u'fgdfgf'
    ! \% K8 H, V0 Y7 [9 u" _
  206.         NewRe7 = u'fgfgf'
    / S! W/ G& C3 l8 j5 ^: \3 \5 G
  207.         NewRe8 = u'ffhgf'
    ; q3 k) c! d0 _2 L. |1 C6 p( k
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'3 `9 B1 K3 G+ ^( I, G6 V
  209.         ReC1 = u'静思'' E1 H/ U9 `4 ^% g+ B( s
  210.         ReC2 = u'aghgf.com'5 e8 V6 q1 [; |
  211.         ReC3 = u'aghgfh.com'
    5 U6 a" z. l( \+ I1 }
  212.         ReC4 = u''1 v$ [% g  u, K$ y4 |
  213.         ReC5 = u'文学网'" z6 {4 {' ]( x! ?& s+ f
  214.         ReC6 = r'<BR>'' h6 v+ Z! }3 ]' T; j6 A" E
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称* c6 @! {; o7 r! z; {  v
  216.         print Bookname
    9 G& P. \9 e- `
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    ; x6 j+ J: A* n+ w1 @$ e
  218.         Book_author = response.save['Book_author']   #小说作者
    / @: B7 {* a& |0 w/ {* U7 O8 _
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    $ w" Q/ b. B" S* s. Q; ^& A
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新0 z5 i/ ~- @/ x. k
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    8 U% }) T2 y- e: ?% r# v
  222.         Bookurl = response.url   #小说网址
    ; y% E4 e, `# }/ p3 t* M
  223.         Booktitle = response.doc('.article-title').text()   #章节名称) A! X  a+ c- S5 Q, Y" L
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    & y2 T4 j  A# z; I5 W
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    - d& [8 }, q5 V; l' R5 ]+ o, w
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    . {1 E/ P$ G) a- d( _
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    : J% P7 H8 e& z/ {
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)" f2 T/ V6 ?, U9 u: k6 d' ~3 _6 x
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    . ?- z! Y1 `; e5 q
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)9 ]7 P5 p9 J5 u1 c# Z! ?7 \
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    * H1 D* ~9 ]$ R1 ~$ D' g7 s4 K  N
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    . X1 B5 c- R9 Z
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    * A- {7 U8 e$ ?7 @/ r' w9 O
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    ( {; \, {, I5 ?$ k; Q. P1 t( l
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    " g% |2 b0 y4 F
  236.         print BookConte
    ' [  f  E) W; Q3 ~: `0 P$ W
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)* L9 m" J: r  w  [
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)9 i7 _4 {. O2 x+ k
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    0 M& Y( g  ]# F  O
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4). D1 o3 M7 [) D* w+ y: U1 l
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     5 R/ S+ J! C5 J7 N" }" g0 y6 g9 Z
  242.         Book_img = response.save['img'],  #小说图片' h) t6 k' k1 y5 n0 P9 r/ q# N
  243.              * o- u& ]2 ]# G8 [; N& G
  244.         #insert into MySQL 小说入库
    / o2 u9 u! B! \) F
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布' Y5 V  a6 K$ p5 w, L1 J2 c: O$ Z
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布  _9 U3 L. Q* L* P& n. T4 K% e) M
  247.         #post提交发布
    . t* ^5 o# w# _+ F9 v* b
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    6 t# G$ V. X& {2 C
  249.         Datos = {- o; ^5 j/ ?7 N! _9 t
  250.                   "Cater_Name":response.save['Cater_Name'],
    : m, s: g5 f6 w. u
  251.                    "Book_author":response.save['Book_author'],
    5 n: m+ D8 {# K; Q, }
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    0 |8 Q# g- i6 Y: @1 ?! x7 n
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
      J& P& S& ~4 G1 M+ k
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    4 W& ^4 q# ?* h, a
  255.                    "img":response.save['img'],
      U) Y1 o' a! v
  256.                      }
    3 |3 ?" N* W3 k# w+ F) [, o8 a
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    % x, t3 B2 p# d+ V5 P: x
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ' L& q9 u4 w+ A/ n
  259.         return {* Q. ~1 u: R3 B& u  l" m
  260.             "Cater_Name":Cater_Name,; u# Y9 w1 W7 R0 a/ n0 u
  261.             "Bookname":Bookname,. L+ f: g8 v( V& o3 V. R% w, `
  262.             "Book_author":Book_author,
    4 I1 f8 C, b9 z! t2 ?: O
  263.             "Book_Introduction":Book_Introduction,
    ' y0 o; C: O! z( S$ R: r
  264.             "Book_Synopsis":Book_Synopsis,: a0 \- M, r* u  k" [8 M4 M
  265.             "Book_Palabras":Book_Palabras,5 ?& |6 Z& `; ^* Q$ D
  266.             "Book_img":Book_img,
    ( ^4 L; v# X3 D+ u. m
  267.             "Bookurl": response.url,
    # \* \+ K% _+ T
  268.             "Booktitle": Booktitle,$ _7 ?+ k  _$ Z/ `- k9 A
  269.             "BookID": BookID,
    5 H( H* H2 T5 p/ Q# s4 C- k
  270.             "BookConte": BookConte,' z* R$ ?2 j. K) u8 k! s
  271.             "Titleid": Titleid,
    $ x) r: Q; v& x. l+ }0 S. ^
  272.             "abover":abover,
      i  ^9 K  j9 [* w
  273. #            "Book_Date" = str(datetime.datetime.now()),+ q* R8 `* j/ i! _* K/ Q/ Z
  274.         }
    + a  k- j( d" _% G7 f& k1 h
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    * t1 Y7 z/ }- _
  276.         if not os.path.exists(imgDir):
    5 u; L: P% b9 h
  277.             os.makedirs(imgDir)
    # B; y/ q0 w4 j) N0 z8 y/ v
  278.         file = imgDir + "/" + file_name
    - o. l3 a( m; B- l
  279. #        print file
    ; V5 B6 V1 W" i. l' y: ~0 E
  280.         f = open(file, 'wb+')
    5 U7 y6 D& D1 K
  281.         imag = requests.get(Book_img) 7 \- c! e* Q- h: x, ?$ B
  282.         f.write(imag.content)
    , C9 m7 y% e9 i' U5 q" o' c
  283.         f.close()
    ' ~! l& j5 a6 P! Y4 ~- e/ U
  284.         #保存图片前
    6 N* x3 S2 @* o8 S9 g5 E8 R
  285.     def save_imgs(self,response):
    " V6 z6 Z/ a) N1 N0 n& |2 m
  286.         content = response.content
      V; n' T+ V# U% I
  287.         file_name = response.save["file_name"]- P/ g3 O* m& [) s/ m- T/ ]% \8 b
  288.         imgDir = response.save["imgDir"]& k$ O& C8 w6 l$ ?# n# C
  289.         file_path = imgDir + file_name$ e+ @& B: }; o) I
  290.         self.save_img(content,imgDir,file_path)/ Y* k) d3 f( w; T% o0 u6 r
  291.     #保存图片
    ! S6 d5 E) I2 ?- T
  292.     def save_img(self,content,imgDir,path):
    $ w0 `2 N; b8 ^7 v
  293.         if not os.path.exists(imgDir):                        
    0 Z7 z" Q1 y+ h$ j' q2 `; Y/ P
  294.             os.makedirs(imgDir); O! i) _& }6 G) ~: x0 X7 v
  295.         f = open(path,"wb" )
    ' |5 [5 j& S5 h# ], {
  296.         f.write(content)5 B+ T) _' {$ a$ p2 p7 S
  297.         f.close()
    # A% f. X  b" u% W- h; c
  298.     #获取url后缀名+ J3 L2 ~- T1 A
  299.     def getExtension(self,url):                           
    8 l- \& E+ G: r' Y, p( \
  300.         extension = url.split(".")[-1]
    " i2 v/ L4 V* J7 ^8 ~9 {
  301.         return extension
    , H& p; T+ w/ }$ ~( P% W
  302.     5 r) X/ P8 J. X/ L
  303.     #获取图片名/ `% @( x/ r4 I
  304.     def getname(self,url):4 Z9 K# X" e9 s
  305.         name=url.split("/")[-1].split(".")[0]2 J# d( }0 J+ m' x3 b, t6 }
  306.         return name
复制代码
1 G1 Q) @6 U( p; ^" S
) }. a: k! y! v9 }8 I' u" {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-4-15 06:49

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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