找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

! E7 B5 R7 @' g- T! N
% `9 k7 T6 u  ^& m% E9 z& m
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-6 07:52

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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