找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!. p" s1 Q- k6 ?8 f  v
  1. #!/usr/bin/env python: G2 H( k7 E1 ]
  2. # -*- encoding: utf-8 -*-
    , Q, ]0 P0 ]- t: r! i, Y
  3. # Created on 2019-05-05 21:43:11% b$ H* C3 ?# R
  4. # Project: XiaoShuo
    - b; E9 b( W+ h
  5. 4 x& P" _5 T! r7 C. ~
  6. from pyspider.libs.base_handler import *
    - x. \; [8 V1 t
  7. import pymysql
    ' `, K; Y: X% b# n! M( c( x: p# a
  8. import random8 c8 ?; P6 s0 v& i* {7 d; \
  9. import datetime
    + ?% O. o" \3 l, E8 o
  10. import urllib2,HTMLParser,re
    $ o! w0 p+ w9 I' }3 M
  11. import os6 \0 Y/ @; ^/ C4 @, w
  12. import sys
    8 i. q* g1 C8 d3 |( a
  13. import re% I. \" V7 C: ^  g+ W; q5 B& c
  14. import codecs
    $ M5 p& ]. r7 j$ ]
  15. import requests
      ^6 S1 \0 ]7 ^: }7 v8 ^
  16. import json
    6 e3 {1 _; O/ m9 Y4 K3 b( k4 k
  17. 9 `, o0 G1 w" a! m1 }' \$ B( s
  18. class Handler(BaseHandler):
    , k7 w9 x' c4 }! z5 {
  19.     global Datos
    + P0 l1 A; \4 m$ c+ k3 a
  20.     global P_dir    ! N  ]) M% k/ }3 w. Z
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    , m8 i+ z" ~; s0 O6 I0 u3 k* Z# J1 s
  22.     global Datos
    ; q- q1 r! @) w3 T
  23.     Datos = {}
    / b6 A: Q: f* y; R  H
  24.     headers= {3 Q. a0 y! o0 d, L" C# N. w2 y4 e
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',. F* }8 L: Y! S& D' w
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    ; j! R4 z6 W% y$ P
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    - f- g- X( \  Z1 O$ u: t
  28.     'Cache-Control':'max-age=0',
    / N: l0 c( O0 D: s
  29.     'Connection':'keep-alive',9 w+ q1 J- C5 Q! h
  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'0 E$ q' w+ |$ m8 j$ q9 V; b
  31.     }! S$ y. U; M' C+ W& f* ^6 r
  32.     crawl_config = {! |( ^( K" r9 c" R* ?/ z
  33.         'headers' : headers,8 ~% g! A7 q# C- d6 j
  34.         'timeout' : 300: V4 S# m. f! h& H( w( l' m' {
  35.     }& @2 o# B+ l, P1 q
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    2 a2 k. S9 W4 C- R, Z4 R9 C% d
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")% Q# D3 c$ Y5 P0 ^" u( ?$ o2 c
  38.         try:
    ! l+ D1 T/ E) l- |" \$ n$ P) s
  39.             cursor = db.cursor()1 }  e% K( ^, {1 d; x6 H
  40.             #注意此处字符串的占位符要加双引号"%s"
    - C) M3 |) |; V) M& ?
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);6 Z% E) s  b- J( O
  42. #            print(sql)! G, i! @; Z/ d. R+ M6 p
  43.             cursor.execute(sql)
    # d  }  w" w! O' q& ]. ^  g
  44.             
    - W3 `. I0 i9 Y, g' V3 F# J
  45.             #qid = cursor.lastrowid5 Y# k2 t( w+ [! o* \8 d' [
  46.             #print(qid)+ @( J9 A' L. \% h, ~7 \  M8 J
  47.             
    . [! U$ B  g2 {1 O: z, U
  48.             db.commit()
    4 I, q0 V# Y2 F' C& A' t& p- L1 Y
  49.         except Exception as err:
    ) q7 M# v- A7 M- c$ h+ v- W$ e& ~
  50.             print("Error %s for execute sql: %s" % (err, sql))
    & S! K: i3 }0 N3 p5 s& R' q' x
  51.             db.rollback()$ y3 g9 b  h( X( e
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    0 L+ b. h) c0 a5 G" t
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ( k% Z! {2 N+ Z4 k0 ~& }9 D
  54.         try:
    / O+ ~0 e: d4 D" e/ K
  55.             cursor = db.cursor()
    : d7 C* [; E8 ~9 s
  56.             #注意此处字符串的占位符要加双引号"%s"
      q3 h3 N! B9 }0 E4 s0 H
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    " c! F4 m9 d' h9 E1 h6 [/ Q
  58. #            print(sql)
    ) w( K7 P& Q# l3 u1 k
  59.             cursor.execute(sql)
    3 n) |3 o7 R3 @& _& a9 z; t
  60.             
      {1 M1 [0 U4 c& Z1 q/ o
  61.             #qid = cursor.lastrowid
    7 x, W. F4 B4 m" D0 _
  62.             #print(qid)1 P- n& C3 l6 A6 b
  63.             ( _; f& k  m% u; [4 H3 g( J( g
  64.             db.commit()
    + t2 @2 }6 t# A: {# t% r+ D
  65.         except Exception as err:' s6 ?* K: q( y: P' Y
  66.             print("Error %s for execute sql: %s" % (err, sql))1 |3 v9 r( i1 }; L
  67.             db.rollback()7 J7 a2 p6 j! c; c/ x# O; Y
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
      n+ b, _6 i, C. S
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    % @0 I  e) h/ L( |4 O( `
  70.         try:' o' x0 u; g* w0 O0 q
  71.             cursor = db.cursor()
    4 A7 n1 A# l5 F. U3 `
  72.             #注意此处字符串的占位符要加双引号"%s"
    ; ~9 Q2 @' d; H* \! j9 r
  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);4 x" J) Y+ d; ]/ e! n
  74.             print(sql)+ d1 M: c: O. v0 @: a; @( W
  75.             cursor.execute(sql)$ i1 T; V- D) t1 ]
  76.             print(cursor.lastrowid). M% N  A# f; T# L2 M" I8 p7 V
  77.             db.commit()) H3 S6 l* s4 E$ \- F4 `. |
  78.         except Exception as err:$ N: A# P: H5 C# S
  79. #        except:
    ! S2 {' U5 j, `' q; m! s
  80. #            print('Failed')& a. \& Y2 }5 j- I+ ^
  81.             print("Error %s for execute sql: %s" % (err, sql))* [2 I* D/ z; H, h4 `3 R# _$ |
  82.             db.rollback()
    + \" q# M6 j" c( M+ E& m
  83.         
    ! t6 I8 N/ c4 i, A4 n3 Q. y$ c  U
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    ( z% d. D( y* b+ l4 i
  85.             reload(sys)
    ) N3 {- I7 H4 l& r8 Z
  86.             sys.setdefaultencoding("gbk")
    4 _0 I6 c1 M( r' V+ u
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址0 D; ]" n) r% W! \8 L# s5 Y
  88.             locoy_data = {
    ( _0 j3 c+ S8 N  c
  89.             'my_u':'用户名',   #后台用户名
    : U! x7 p- l9 |. w
  90.             'my_p':'密码',   #后台密码
    ' _; c6 V2 ]2 L. w1 q& M0 a/ ~+ Z
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    3 ?9 r0 |" y6 I2 r9 m4 W8 G
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    & R8 |( ?- G% f' u1 A
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    . C  x  t, [$ z' V; N" {7 r! N: c
  94.             'article':BookConte.encode('gbk', 'ignore'),4 V$ C- Q8 t- q
  95.             'author':Book_author.encode('gbk', 'ignore'),* ?. ], E8 }8 R7 T; I& v5 p
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    + w3 q* K1 ~, b2 M+ l0 e: K
  97.             'thumb':Book_img,
    % W  B5 B8 |( x4 m5 {1 G2 h5 Z$ j
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),5 m9 V% R- E$ [9 V# S7 u, t# A" k
  99.             'abover':abover.encode('gbk', 'ignore')           % x  @7 o, A, W! R" t% A
  100.                 }
    2 s  P1 i0 \) I: D
  101.             res = requests.post(locoy_url, data=locoy_data)
    ( j  b( U6 B# e* k& g1 z
  102.             print res.text5 y3 x; V* k' }) L
  103.             print res.content
    ; \. u) M1 {5 d0 z  m2 W- s
  104. #            print Dsd
    $ i6 z' H, E) Q+ @. A6 R
  105.             return res
    " a' J7 B' w+ f2 y, v! l
  106.    
    , \; [8 m0 W- V
  107.     def __init__(self):! \& W$ w& q. K, V
  108.         self.base_url1 = 'https://www.****.cc/': C: n) u8 L. o  q
  109.         self.base_url2 = '/'2 f2 g$ q6 `: o8 V- ]7 E
  110.         self.CaterId = []
      J7 C2 g% c7 B* h
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    . ]- o& p; |- v/ i1 u5 _
  112.         self.page_num = 1
    % T4 s# {" B, n( |: K, e
  113.         self.total_num = 200   
    , @" N3 F% n3 f% c4 v

  114. / ]4 v; S4 Y: x  z! l
  115.     @every(minutes=8 * 60)0 p5 J/ w: @* t2 `, F3 R
  116.     def on_start(self):$ j* }! [7 ^2 ]! a- [! T, ]- u
  117.         global Cater_Name
    + N5 C) K/ @0 [* d, g) ]; d! k
  118.         Cater_Name = []7 |# ~' t1 x  G) I* K; x: j9 O: W
  119.         while self.page_num <= self.total_num:
    ( l4 Y( D( f. j' M8 \' X0 z1 M
  120.             for self.CaterId in self.CaterIds:
    9 q, `+ {1 ~* \5 L
  121.                 if self.CaterId  == 'xuanhuan':/ f5 f6 w- C% Z4 Z5 s" k) P
  122.                      Cater_Name = '玄幻'4 d0 Z( v0 k# @9 w! q' ]' j( O( z
  123.                 if self.CaterId  == 'wuxia':/ `/ M$ P( M0 g) t2 W% Y- }! t
  124.                     Cater_Name = '武侠'. Z  R  I6 `$ t4 C: z; L6 Z* J
  125.                 if self.CaterId  == 'lishi':
    " K* _# J4 `" r; f1 r4 l
  126.                     Cater_Name = '历史'            " I; b  o: Z2 |1 p: c2 V2 F1 H3 d; ^1 i
  127.                 if self.CaterId  == 'yanqing':
    & a. m5 C! H- Z( U; P8 ?( e# n
  128.                     Cater_Name = '都市' ' {& v8 B( c4 O* F& l
  129.                 if self.CaterId  == 'nvsheng':. \" B! Z  r. g
  130.                     Cater_Name = '都市' * D/ F9 w$ I( m( k6 u# p* k
  131.                 if self.CaterId  == 'kehuan':
    ) {, m4 W  g8 G) T# k- L, M
  132.                     Cater_Name = '科幻'
    % }: D, g& [# G" Q8 _
  133.                 if self.CaterId  == 'kongbu':1 R/ D) F1 p( V% Y6 E
  134.                     Cater_Name = '游戏' % t5 [) z7 x+ w" t; b
  135.                 print self.CaterId0 N. {* f! J4 L* [. ^" f
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          . d: ~% ?( \( G$ R- a0 d. i& Y2 `; M
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    3 n2 F4 R" k: K
  138.             self.page_num += 1 - j( Y: Y: `5 P+ {+ z3 e8 B3 P  t
  139.             
    + I! O8 i1 }! D8 ?# S( _+ w+ u
  140.     def list_Caterg(self, response):7 k9 L6 t0 G4 z: Y. R# {1 w7 N
  141.         Cater_Name = response.save
    ! E; Y+ K7 k6 U: a  I
  142.         for each in response.doc('.pic-list a[href^="http"]').items():8 Z. t$ O" z  w
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    , v/ J) o# q6 P
  144.             
    7 K* t+ H1 D+ Q2 e, s
  145.     def list_Caterg_detail(self, response):
    " A& w1 E: F% n0 i
  146.         Cater_Name = response.save
    + I2 w* p- x* @. Y6 n
  147. #        print Cater_Name$ l0 Y& P- h! I; W# z
  148.         Bookname = response.doc('h1').text()) E6 T( v; N  x% A' }
  149.         print Bookname
    6 ^+ M3 v5 g- c( ]4 S( `$ d
  150.         Book_author = response.doc('.authorname > a').text()4 L" h) F6 S/ p: \# x! D# ]& A
  151. #        print Book_author
    1 q0 W! o% x4 Z7 @4 k! N2 _- z
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    " S4 \& J% f% W4 I3 k
  153. #        print Book_Introduction+ r& ~1 G4 M- p- A/ h* P
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    0 K2 N' ]' {& l- \7 f
  155. #        print Book_Synopsis
    % t# X9 W* i8 @9 ^4 n7 H- t; x2 \
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]0 _6 D3 X+ u$ Y
  157. #        print Book_Palabras  ~2 z8 [& J$ ~1 b* Y8 W8 _; X" q
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    ) Z# `' J: P1 z+ P
  159. #        print BookIDs% G" m( I( B# ]8 w, e- ]* V6 s
  160.         Book_Dates = str(datetime.datetime.now())         
    5 t" O3 O* _* B- j: D
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():9 M# P! a! w" O/ i# B4 v
  162.             img = imgs.attr.src5 W' z4 R: e, O( h7 ]( D9 w) I
  163.             print img
    9 e3 G$ M- ?- f# o/ @
  164.                 #小说封面下载
    5 r. ^% N. \+ L, Y
  165.             extension = self.getExtension(img)
    . l4 `9 s3 i9 g5 ]5 T0 T
  166.             name = self.getname(img)4 Y" |) Y/ p1 x/ }/ _: R1 _
  167.             file_name = name + "." + extension2 }6 P# v, r. O7 n% H/ d* L5 q) p7 V
  168.             imgDir = P_dir + name
      ^( Y* _$ J6 J; [: g0 U7 z
  169.             Locaimg = imgDir + "/" + file_name
    0 r6 D- W- i& k
  170.             print Locaimg& L% E" L3 T7 j+ {/ Q
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
      n( m8 i: |. z( e8 u  R/ e
  172.                 print('attachment url is ' + img)               #
    : v0 x' z8 U" b6 K: ?2 I
  173.             Datos = {
    8 b# ~- E3 B( w
  174.                     "Cater_Name":Cater_Name,  J/ s7 ]/ T/ s% G- T$ @
  175.                     "Book_author":Book_author,
    ) M2 @0 e% e/ n4 R( v7 l
  176.                     "Book_Introduction":Book_Introduction,
    " x- e& h! x* a
  177.                     "Book_Synopsis":Book_Synopsis,
    " G; G% Z* k. f
  178.                     "Book_Palabras":Book_Palabras,
    ; u1 _" L+ `( p3 R! o3 Q
  179.                     "img":img,
    1 x, v9 C" R7 F8 f: S
  180.                 }
    * o) o% v" @1 w, N
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布9 H6 \7 w) p- D, b% t: U
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():$ J$ c8 V/ }% N6 y
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    0 O( \7 F$ R. o
  184.             
    . r4 \2 P4 |4 X1 J5 `  s! V0 Y
  185.     @config(age=8 * 60 * 60)   
    . M4 K+ H1 H  ~) ^* S
  186.     def index_page(self, response): - p4 {' J  O' a7 s5 ^" A
  187.         Datos = {
    3 v& X8 Y+ R2 O. g8 b' I
  188.                   "Cater_Name":response.save['Cater_Name'],
    4 Z, k% i! u4 i' j
  189.                    "Book_author":response.save['Book_author'],  Q$ C: p: N2 d* `1 y
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    ) q$ I8 E8 d$ {
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],, c# @/ d! _3 b1 [1 h
  192.                    "Book_Palabras":response.save['Book_Palabras'],; i* F* o( t, q" L; ~
  193.                    "img":response.save['img'],& B  n% Y" d9 q& u
  194.                      }
    $ R. i8 m' i' U( c
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():' j! ~6 f- U5 ~# J
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  ( n  m0 X  i" b4 ?& x
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    * Q, {3 h- ]7 s5 e
  198.     @config(priority=2)
    : N- `! `. @! B4 R5 W9 h9 u  A
  199.     @catch_status_code_error
    4 {! m5 V0 o. o# e/ z
  200.     def detail_page(self, response):        0 W6 a, v$ Y- s- p
  201.         NewRe1 = u'哈书'- h5 ~+ X! r1 g) H, ^
  202.         NewRe2 = u'huhjsd.CC'% W! W" z, ]0 T7 ?' ~1 ?
  203.         NewRe3 = r'^\\n\\n'9 B  b  Q9 M9 S9 T8 ~
  204.         NewRe5 = u'小说网'
    1 ?- h" p' O6 e# B$ W) {6 i
  205.         NewRe6 = u'fgdfgf'0 g( b4 n: h8 U* D
  206.         NewRe7 = u'fgfgf'
    2 [3 G) U; O' V8 E1 {! A5 @
  207.         NewRe8 = u'ffhgf'
    ) e, p5 O( s2 ~+ {
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'% c9 R4 r8 Z; ^. r9 ^; x" v
  209.         ReC1 = u'静思', c( M" f, Q3 p/ r+ k
  210.         ReC2 = u'aghgf.com'
    + H; ~* e' m- J" ~. Y
  211.         ReC3 = u'aghgfh.com'
    & v0 B5 Q0 Z( r) P, G9 G6 J8 s& \
  212.         ReC4 = u''
    4 W! @2 U# K7 V, m; |
  213.         ReC5 = u'文学网'2 m6 l5 @( {4 l
  214.         ReC6 = r'<BR>'
    & c7 N, D; e( T# y
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    5 O' L! \$ [" F1 H% Z* J) ^( R
  216.         print Bookname
    $ |( ?  h7 {: n0 \" {
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类. t+ J9 x( i, M3 ]
  218.         Book_author = response.save['Book_author']   #小说作者
    & D/ J! R0 |4 U% h# t" R& O( w
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介- R+ d, S. Q! A; I9 h  m
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新5 ?: a# x2 C) p
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数, A: m; n7 Z& s6 Z& o
  222.         Bookurl = response.url   #小说网址0 ]9 s% b6 x5 ]7 a
  223.         Booktitle = response.doc('.article-title').text()   #章节名称: C3 m: ~' w: Y
  224.         BookID = response.doc('.readset-r span').text()   #小说ID4 r) @1 \8 i  a+ S# R" f% j$ D( ^9 @
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    5 J- R' v( L1 ^0 l# C: g, D9 C7 R1 w
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    : D3 t7 @4 b" ]: u" }: S% s9 [
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    " H* |4 ]) B0 g  J2 O' l1 N
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    ; B4 M) g1 r0 t" `
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)( _1 Q; V" z9 z- e0 L* D" j9 D) L+ m
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)2 G# W: T6 P- N; X/ h: q$ G; g
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)4 w& D/ D3 [/ X0 k5 d5 E$ C' u: {
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
      L  _( U* M' \7 M7 Z
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)8 H4 f" z8 ?" q5 }  @+ P6 M
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    3 J# y, |- }# x% G% r
  235.         BookConte = BookConte4.replace("\n\n","<br>")1 U" I! v+ F. r8 h. h8 `" j" @, a# c
  236.         print BookConte
    5 I; L$ F. C  O8 T. ^7 Y
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)$ ]9 U0 z3 Z$ X1 I3 n4 F
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    * h  S4 `) b/ c3 K% \( a
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    $ Y% X" u+ S& |" D7 b
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4); P& i  ?5 g6 W' g* |$ m
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
      J  g4 w- R! T( s0 S
  242.         Book_img = response.save['img'],  #小说图片1 K; a4 p% V7 E# F
  243.             
    * O! i8 s  A2 H8 t0 X9 \: \: t; c1 c
  244.         #insert into MySQL 小说入库- I  Z# h0 z5 s  p
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布# I7 F. |6 P) G9 y
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布. y) n! k% a7 _# g  W0 N1 |! o9 L+ l: D
  247.         #post提交发布
      X9 {5 j+ \, w# k
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消- p9 m7 G- T0 H* N9 f
  249.         Datos = {
    / U: j! e3 n. c. e; L/ [# x
  250.                   "Cater_Name":response.save['Cater_Name'],
    8 ]+ I0 d" u% S
  251.                    "Book_author":response.save['Book_author'],
    # i2 a( J! b; p- ]$ q5 V7 z4 R
  252.                    "Book_Introduction":response.save['Book_Introduction'],4 P, x9 |, E) x
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],7 o( i/ C- ~) M5 H; a" L. s
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    2 W& ~/ H, r, g! ?. m+ j( v
  255.                    "img":response.save['img'],
    5 E3 z& N; D' W, ?) w
  256.                      }0 @/ `/ W( \9 o
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():) a$ N. g1 Q7 ?$ x8 j$ i
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) ! _7 V3 \" t3 A% U  w- O1 G
  259.         return {& x$ H. Z3 \$ i6 K4 h' E' h4 K7 O
  260.             "Cater_Name":Cater_Name,- Z2 y- D% L5 {) z+ i
  261.             "Bookname":Bookname,: ~, k" @7 n; I- ]! k
  262.             "Book_author":Book_author,* D% v: T- Y) ?/ R$ I* `
  263.             "Book_Introduction":Book_Introduction,$ v3 _: f& r  f* Y
  264.             "Book_Synopsis":Book_Synopsis,) |: V! K1 n9 _6 C+ ]5 n8 U1 W1 n! Z
  265.             "Book_Palabras":Book_Palabras,& i* W2 K0 T' u& B
  266.             "Book_img":Book_img,' e5 m% v" W9 T  b% N- z1 h$ Y
  267.             "Bookurl": response.url,2 w. }. z" M0 g2 _7 L* |/ t& {
  268.             "Booktitle": Booktitle,
    * s6 K; x* j- p9 G$ w
  269.             "BookID": BookID,& z( e. E. g1 T9 Q4 K; J( U" m
  270.             "BookConte": BookConte,# k8 z3 g* K' a/ ^! l
  271.             "Titleid": Titleid,4 i0 y; k: }1 A1 ?
  272.             "abover":abover,
    9 m  J# }: C  a+ R% o! c" f0 Y
  273. #            "Book_Date" = str(datetime.datetime.now()),
    . n) Y. M9 E& n
  274.         }
    , Q5 p) R! B, i! u6 V3 ?! g& i4 N( ]
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    2 s) ^0 s6 b2 n( _% }
  276.         if not os.path.exists(imgDir):
    / {2 w3 ]0 W+ l! F3 _$ ]1 o
  277.             os.makedirs(imgDir)6 C( u( l5 ?6 `! L1 K9 z
  278.         file = imgDir + "/" + file_name
    3 b0 L/ C. n: Q- G
  279. #        print file
    * K3 p# X, G: T/ \
  280.         f = open(file, 'wb+')
    - t1 O4 h% W0 U' i4 c; ~, [
  281.         imag = requests.get(Book_img)
    1 {7 w+ N+ B0 W: ^8 u  P
  282.         f.write(imag.content)
    7 b, ~2 Z8 A& U; p- U& S% i
  283.         f.close()
    2 N& A' S8 O- m9 w7 o8 P7 @& i
  284.         #保存图片前* i, e/ k9 J" N1 Q& p& B; y9 m
  285.     def save_imgs(self,response):  Q9 {5 T- D# B4 f
  286.         content = response.content2 O" ?+ d3 N; I* r) p/ U. U
  287.         file_name = response.save["file_name"]* q( {: x1 N1 T7 H# E
  288.         imgDir = response.save["imgDir"]
    ) }: Z2 C4 `7 H* d$ g9 u
  289.         file_path = imgDir + file_name
    % x. [4 Q/ x# Q% I5 K. V' N, k  j: U
  290.         self.save_img(content,imgDir,file_path)
    2 y1 @. G( J& `3 N
  291.     #保存图片
    ) V2 x1 k+ t( M- W9 j7 X
  292.     def save_img(self,content,imgDir,path):
    ( Q3 P& q* R  l, S4 x+ }
  293.         if not os.path.exists(imgDir):                         - r0 D7 @& N( K5 h
  294.             os.makedirs(imgDir)
    ; q6 W8 _; p; W% l0 y
  295.         f = open(path,"wb" )" ?' I4 i' ]) W5 W: r/ F
  296.         f.write(content). ?! v1 j/ h) r- r" d
  297.         f.close()
    7 y5 {  ^1 F% `3 R- ^# I7 X
  298.     #获取url后缀名
    ; c4 x! K- }& _" r
  299.     def getExtension(self,url):                           
    1 Y" L8 y. k7 n1 Q( r
  300.         extension = url.split(".")[-1]
    1 l5 a5 T* Z7 r8 h4 J& o9 y
  301.         return extension
    6 U0 R7 G6 r! |& G! ~
  302.     # \  j& K  [0 S3 b( i0 @& R& f6 g
  303.     #获取图片名
    4 l  z) [3 l1 E# G: i$ z  K& B
  304.     def getname(self,url):
    8 B/ Q1 v0 U# r6 F/ Q
  305.         name=url.split("/")[-1].split(".")[0]
    / l, w* y4 X6 |% @& ]0 N8 ^! }$ u% N
  306.         return name
复制代码

1 u& v1 E) C1 T% _2 u# q' p
2 ~8 x# X! `; b8 f: K
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-1-23 04:06

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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