爬蟲實踐其二

動態獲取php

from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path='./chromedriver')
bro.get('http://www.baidu.com')

text = bro.find_element_by_id('kw')
text.send_keys('時間')
sleep(1)
button = bro.find_element_by_id('su')
button.click()

  

phantomjs插件的使用html

from selenium import webdriver
from time import sleep

bro = webdriver.PhantomJS(executable_path='/Users/Administrator/First_jupyter/phantomjs-2.1.1-windows/bin/phantomjs')
url = 'https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action='
bro.get(url)
sleep(1)
bro.save_screenshot('./1.png')

js = 'window.scrollTo(0,document.body.scrollHeight)'

bro.execute_script(js)
sleep(1)

bro.save_screenshot('./2.png')

  

 

Scrapy使用python

 

a) 概念:爲了爬取網站數據而編寫的一款應用框架,出名,強大。所謂的框架其實就是一個集成了相應的功能且具備很強通用性的項目模板。(高性能的異步下載,解析,持久化……)linux

 

b) 安裝:web

 

  1. linux mac os:pip install scrapy
  2. win:
    1. pip install wheel
    2. 下載twistedhttps://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

 

        pip install 下載好的框架.whlredis

 

      3.pip install pywin32chrome

      4.pip install scrapywindows

c) 基礎使用: 使用流程cookie

    1.建立一個工程:scrapy startproject 工程名稱     #scrapy startproject firstBlood  框架

    2.在工程目錄下建立一個爬蟲文件

    3.cd 工程                    #cd firstBlood

    4.scrapy genspider 爬蟲文件的名稱 起始的url     #scrapy genspider first www.qiushibaike.com

    5.對應的文件中編寫爬蟲程序來完成爬蟲的相關操做6.配置文件的編寫(settings

     19行:對請求載體的身份進行假裝

     22行:不聽從robots協議

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

 

    6.執行 scrapy crawl 爬蟲文件的名稱   --nolog(阻止日誌信息的輸出)                  #scrapy crawl first

 

class FirstSpider(scrapy.Spider):
    #爬蟲文件的名稱:經過爬蟲文件的名稱能夠指定的定位到某一個具體的爬蟲文件
    name = 'first'
    #容許的域名:只能夠爬取指定域名下的頁面數據
    allowed_domains = ['www.qiushibaike.com']
    #起始url:當前工程將要爬取的頁面所對應的url
    start_urls = ['http://www.qiushibaike.com/']

    #解析方法:對獲取的頁面數據進行指定內容的解析
    #response:根據起始url列表發起請求,請求成功後返回的響應對象
    #parse方法的返回值:必須爲迭代器或者空
    def parse(self, response):

        print(response.text)#獲取響應對象中的頁面數據

  

    def parse(self, response):
        div_list = response.xpath('//div[@id="content-left"]/div')
        data_list = []
        for div in div_list:
            # title = div.xpath('./div/a[2]/h2/text()').extract_first()
            # print(title)
            content = div.xpath('.//div[@class="content"]/span/text()').extract_first()
            #不是直屬的div 就用 //  兩個表示,若是是直屬就用一個 /

            content = div.xpath('.//div[@class="content"]/span/text()').extract_first()
            print(content)

  

持續化存儲:

其一:

用指令,首先在parse方法裏面返回一個值,

再使用終端指令,---> scrapy crawl 爬蟲文件名稱 -o 磁盤文件.後綴,

scrapy crawl tang -o tang.csv --nolog

  

其二:

基於管道操做

i.items:存儲解析到的頁面數據
ii.pipelines:處理持久化存儲的相關操做
iii.代碼實現流程:
  1.將解析到的頁面數據存儲到items對象
  2.使用yield關鍵字將items提交給管道文件進行處理
  3.在管道文件中編寫代碼完成數據存儲的操做
  4.在配置文件中開啓管道操做

item.py

class TangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title1 = scrapy.Field()
    content1 = scrapy.Field()

#先定義後名稱key

  

    def parse(self, response):
        div_list = response.xpath('//div[@id="content-left"]/div')
        data_list = []
        for div in div_list:
            title = div.xpath('./div/a[2]/h2/text()').extract_first()
            # print(title)
            # content = div.xpath('.//div[@class="content"]/span/text()').extract_first()
            #不是直屬的div 就用 //  兩個表示,若是是直屬就用一個 /
            content = div.xpath('.//div[@class="content"]/span/text()').extract_first()
            item = TangItem()
            item['title1'] = title
            item['content1'] = content

            yield item

#而後使用yield關鍵字傳入管道中

  

pipelines.py

class TangPipeline(object):
    fp = None
    def open_spider(self,spider):
        self.fp = open('./text.txt','w',encoding='utf-8')

    def process_item(self, item, spider):
        title = item['title1']
        content = item['content1']
        self.fp.write(title+':'+content+'\n\n\n')
        return item

    def close_spider(self,spider):
        print('爬蟲結束!')
        self.fp.close()

#最後再在管道里面寫相應的規則

  

settings.py

ITEM_PIPELINES = {
   'tang.pipelines.TangPipeline': 300,   #優先級,能夠500 如此類推
}

終極最後在設置把這個註釋打開

  

最後終端運行 scrapy crawl tang

 

使用lpush命令傳入redis

不知爲什麼按照教程傳入字典時會報錯,後來改用列表方式傳入後能夠

使用命令 scrapy crawl 文件名 --nolog   執行

redis查看:range 數據名(以下是data)0 (起始位) -1 (末位)  ---->   lrange data 0 -1

 

class FirstRedisPipeline(object):
    coon = None
    t = 0
    fuck = []
    def open_spider(self, spider):
        # self.fp = open('./text.txt', 'w', encoding='utf-8')
        try:
            self.coon = redis.Redis(host='127.0.0.1',port='6379')
            print('正在連接數據庫redis......')
        except:
            print('連接數據庫失敗')

    def process_item(self, item, spider):
        self.fuck = item['title']+":"+item['content']
        try:
            self.coon.lpush('data', self.fuck)       #data是傳入的數據名字
            print('正在傳入數據到數據庫.......')
        except:
            print('出錯了')
        return item

 

多個url數據爬取

class TestPagesSpider(scrapy.Spider):
    name = 'Test_Pages'
    #allowed_domains = ['https://www.qiushibaike.com/text']
    start_urls = ['https://www.qiushibaike.com/text/']
    page_Num = 1
    url = 'https://www.qiushibaike.com/text/page/%d/'

    def parse(self, response):
        div_list = response.xpath('//*[@id="content-left"]/div')

        for div in div_list:
            title = div.xpath('./div[@class="author clearfix"]/a[2]/h2/text()').extract_first()
            content = div.xpath('.//div[@class="content"]/span/text()').extract_first()
            item = TomPagesItem()
            item['title'] = title
            item['content'] = content

            yield item
            # print('test2')
        if self.page_Num <= 13:                        #關鍵是這裏要作一個判斷
            print('爬取到了第%d頁的頁面數據' % self.page_Num)
            self.page_Num += 1
            new_url = format(self.url % self.page_Num)
            yield scrapy.Request(url=new_url, callback=self.parse)

 

  

代理和cookie:

如何發起post請求?

  必定要重寫start_requests方法

    1.Request()方法中給method屬性賦值成post

    2.FormRequest()進行post請求的發送

 

代理:

流程:

  1.下載中間件類的自制定

    a)object

    b)重寫process_request(self,request,spider)

  2.配置文件中進行下載中間件的開啟

  

DOWNLOADER_MIDDLEWARES = {
   'post_scrapy.middlewares.MyProxy': 543,             #其中MyProxy修改爲你重寫的方法名字
}

 

日誌:

日誌等級(種類)

ERROR:錯誤

WARNING:警告

INFO:通常信息

DEBUG:調試信息(默認)

指定輸入某一中日誌信息:

settings:LOG_LEVEL = ‘ERROR’

將日誌信息存儲到制定文件中,而並不是顯示在終端裏:

settingsLOG_FILE = ‘log.txt’

 

請求傳參:

 

 

CrawlSpider:

CrawlSpider實際上是Spider的一個子類,除了繼承到Spider的特性和功能外,還派生除了其本身獨有的更增強大的特性和功能。其中最顯著的功能就是」LinkExtractors連接提取器「。Spider是全部爬蟲的基類,其設計原則只是爲了爬取start_url列表中網頁,而從爬取到的網頁中提取出的url進行繼續的爬取工做使用CrawlSpider更合適。

創建:

  1.建立scrapy工程: scrapy startproject projectName

  2.建立爬蟲文件:  scrapy genspider -t crawl spiderName www.xxx.com

 

 start_urls = ['https://www.id97.cc/index.php/vodshow/']
    link = LinkExtractor(allow=r'/dongman--------\d+---2018.html')     #LinkExtractor其實就是一個鏈接選擇器
    rules = (
        Rule(link, callback='parse_item', follow=True),
    )

 

 

分佈式爬蟲

相關文章
相關標籤/搜索