移動端數據爬取和Scrapy框架

移動端數據爬取

注:抓包工具:青花瓷python

1.配置fiddler
2.移動端安裝fiddler證書
3.配置手機的網絡
    - 給手機設置一個代理IP:port

a. Fiddler設置

打開Fiddler軟件,打開工具的設置。(Fiddler軟件菜單欄:Tools->Options)mysql

在HTTPS中設置以下:linux

在Connections中設置以下,這裏使用默認8888端口,固然也能夠本身更改,可是注意不要與已經使用的端口衝突:redis

Allow remote computers to connect:容許別的機器把請求發送到fiddler上來sql

b. 安全證書下載

在電腦瀏覽器中輸入地址:http://localhost:8888/,點擊FiddlerRoot certificate,下載安全證書:json

也能夠windows

c. 安全證書安裝(證書必定要安裝且信任)

證書是須要在手機上進行安裝的,這樣在電腦Fiddler軟件抓包的時候,手機使用電腦的網卡上網纔不會報錯。api

Android手機安裝:把證書放入手機的內置或外置存儲卡上,而後經過手機的"系統安全-》從存儲設備安裝"菜單安裝證書。瀏覽器

而後找到拷貝的FiddlerRoot.cer進行安裝便可。安裝好以後,能夠在信任的憑證中找到咱們已經安裝好的安全證書。安全

蘋果手機安裝:

- 保證手機網絡和fiddler所在機器網絡是同一個網段下的

- 在safari中訪問http://fiddle機器ip:fiddler端口,進行證書下載。而後進行安裝證書操做。

- 在手機中的設置-》通用-》關於本機-》證書信任設置-》開啓fiddler證書信任

d. 局域網設置

想要使用Fiddler進行手機抓包,首先要確保手機和電腦的網絡在一個內網中,可使用讓電腦和手機都鏈接同一個路由器。固然,也可讓電腦開放WIFI熱點,手機連入。這裏,我使用的方法是,讓手機和電腦同時連入一個路由器中。最後,讓手機使用電腦的代理IP進行上網。 在手機上,點擊鏈接的WIFI進行網絡修改,添加代理。進行手動設置,ip和端口號都是fiddler機器的ip和fiddler上設置的端口號。

e. Fiddler手機抓包測試

上述步驟都設置完成以後,用手機瀏覽器打開百度首頁,咱們就能夠順利抓包了

 

scrapy框架

(1)環境安裝

linux:
    pip install scrapy
windows:
    有whell才能下載下載twisted框架: pips install whell 
    下載twisted框架(處理併發相關操做) : http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
    進入下載目錄,執行: pip3 install Twisted-17.1.0-cp35-cp35m-win_amd64.whl
    pip3 install pywin32
    pip3 install scrapy

(2)新建一個項目

建立一個工程

scrapy startproject 工程名稱

此時生成的工程目錄

建立一個爬蟲文件

注:要保證配置文件建立在當前工程目錄下

cd firstblood #在工程目錄下建立爬蟲文件 會在apiders中出現
scrapy genspider first www.xxx.com #first表明爬蟲文件的名稱,www.xxx.com表明起始url

在first.py爬蟲文件中

執行爬蟲文件

scrapy crawl first
scrapy crawl first --nolog (不打印日誌)

robots反爬機制的處理

被robots反爬機制攔截的反應

處理方式(在配置文件中修改此條爲False)

 

User-Agent假裝反爬機制的處理

處理方式(在配置文件中修改此條)

數據解析

xpath表達式的使用以及獲取Selector對象中的date中的值的兩種方式
class FirstSpider(scrapy.Spider):
    name = 'first'
    # allowed_domains = ['www.xxx.com'] #在該文件中,只能爬取這個域名之下的url,一般註釋掉這一句
    start_urls = ['https://www.qiushibaike.com/text/']
    def parse(self, response):
        div_list=response.xpath('//div[@id="content-left"]/div')
        for div in div_list:
            #獲得的div是Selector類型的
            title=div.xpath('./div/a[2]/h2/text()')[0].extract() #將Selector對象中的date中的值
            title = div.xpath('./div/a[2]/h2/text()').extract_first() #直接獲得列表中第0個元素
            print(title)

持久化存儲

1.基於終端指令的持久化存儲(只能將path的返回值存到本地的文本中)

能夠經過將終端指令的形式將parse方法的返回值中存儲的數據進行本地磁盤的持久化存儲

class FirstSpider(scrapy.Spider):
    name = 'first'
    start_urls = ['https://www.qiushibaike.com/text/']
    def parse(self, response)
        div_list=response.xpath('//div[@id="content-left"]/div')
        all_data=[]
        dic={}
        for div in div_list:
            #獲得的div是Selector類型的
            content=div.xpath('./a/div/span/text()').extract_first()
            title=div.xpath('./div/a[2]/h2/text()').extract_first()
            dic={
                "title":title,
                "content":content
            }
            all_data.append(dic)
        print(all_data)
        return all_data

終端指令

scrapy crawl first -o qiubai.csv

注:限制文件存儲的格式,只能是json,jsonlines,jl,csv,xml,marshal,pickle格式的文件

 

2.基於管道的持久化存儲

新建工程

scrapy startproject bosspro 
cd bosspro

建立爬蟲文件

scrapy genspider  boss www.baidu.com

修改兩種反爬機制

爬取Boss直聘的數據

class BossSpider(scrapy.Spider):
    name = 'boss'
    #allowed_domains = ['www.baidu.com']
    start_urls = ['https://www.zhipin.com/job_detail/?query=python爬蟲&scity=101010100&industry=&position=']
​
    def parse(self, response):
        li_list=response.xpath('//*[@id="main"]/div/div[3]/ul/li')
        for li in li_list:
            name=li.xpath('./div/div/h3/a/div/text()').extract_first()
            salary=li.xpath('./div/div/h3/a/span/text()').extract_first()
管道的使用

在items.py中

import scrapy
class BossproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field() # 1.將爬蟲文件中每個要提交給管道的數據封裝成這個類下的一個屬性
    salary = scrapy.Field(

在boss.py爬蟲文件中

import scrapy
from bosspro.items import BossproItem #2.導入item中的類
class BossSpider(scrapy.Spider):
    name = 'boss'
    #allowed_domains = ['www.baidu.com']
    start_urls = ['https://www.zhipin.com/job_detail/?query=python爬蟲&scity=101010100&industry=&position=']
​
    def parse(self, response):
        li_list=response.xpath('//*[@id="main"]/div/div[3]/ul/li')
        for li in li_list:
            name=li.xpath('./div/div/h3/a/div/text()').extract_first()
            salary=li.xpath('./div/div/h3/a/span/text()').extract_first()
            item=BossproItem() #3.實例化一盒item對象
            item['name']=name #4.將解析到的數據存儲到item對象中
            item['salary']=salary
            yield item #5.將item對象提交給管道

在pipelines.py管道文件中

#此文件須要接受爬蟲文件提交過來的數據,並對數據進行持久化存儲(IO)
class BossproPipeline(object):
    #爬蟲文件每提交一次,該方法執行一次
    def process_item(self, item, spider):
        print(item['name'])
        print(item['salary']) #6.在process_item函數中進行數據的持久化存儲
        return item

在settings.py配置文件中

#7.在配置文件中開啓管道
ITEM_PIPELINES = {
   'bosspro.pipelines.BossproPipeline': 300, #300表示的是優先級,數值越小優先級越高
}
#pipelines中聲明的管道類都要在此處開啓
數據的持久化存儲(本地,mysql,redis)
#將數據保存到本地
class BossproPipeline(object):
    f=None
    # open_sipder只會在開始爬蟲時執行一次
    def open_spider(self,spider): #此處的spider是BossSpider類的一個實例對象
        print("開始爬蟲!")
        self.f= open('./job.txt','w',encoding='utf-8')
    def process_item(self, item, spider):
        self.f.write(item['name']+':'+item['salary']+"\n")
        return item #若是有其餘的管道,process_item函數必定要有返回值
    #close_sipder只會在結束爬蟲時執行一次
    def close_spider(self,spider):
        print("結束爬蟲!")
        self.f.close()
​
#將數據保存到mysql
import pymysql
class Bosspro_mysql_Pipeline(object):
    conn=None #鏈接對象
    cursor=None #遊標對象
    def open_spider(self,spider):
        self.conn=pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='',db='pachong')
        print("開始爬蟲")
        print(self.conn)
    def process_item(self, item, spider):
        self.cursor=self.conn.cursor()
        sql='insert into boss values("%s","%s")' % (item["name"],item["salary"])
        try:
            self.cursor.execute(sql)
            self.conn.commit()
            print(sql)
        except Exception as e:
            print(e)
            self.conn.rollback() #事務回滾
        return item
    def close_spider(self,spider):
        self.cursor.close()
        self.conn.close()
        print('結束爬蟲')
​
#將數據保存到redis
from redis import Redis
class Bosspro_redis_Pipeline(object):
    conn=None 
    def open_spider(self,spider):
        self.conn=Redis(host='127.0.0.1',port=6380)
        print("開始爬蟲了")
        print(self.conn)
    def process_item(self, item, spider):
        dic={
            "name":item["name"],
            "title":item["salary"]
        }
        self.conn.lpush('Info',dic)
    def close_spider(self,spider):
        print('結束爬蟲了')

注:開啓線程

在配置文件中修改CONCURRENT_REQUESTS = 32便可

相關文章
相關標籤/搜索