找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

9 s% G6 F4 M3 h) v/ E
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-9 23:10

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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