注:抓包工具:青花瓷python
1.配置fiddler 2.移動端安裝fiddler證書 3.配置手機的網絡 - 給手機設置一個代理IP:port
打開Fiddler軟件,打開工具的設置。(Fiddler軟件菜單欄:Tools->Options)mysql
在HTTPS中設置以下:linux
在Connections中設置以下,這裏使用默認8888端口,固然也能夠本身更改,可是注意不要與已經使用的端口衝突:redis
Allow remote computers to connect:容許別的機器把請求發送到fiddler上來sql
在電腦瀏覽器中輸入地址:http://localhost:8888/,點擊FiddlerRoot certificate,下載安全證書:json
也能夠windows
證書是須要在手機上進行安裝的,這樣在電腦Fiddler軟件抓包的時候,手機使用電腦的網卡上網纔不會報錯。api
Android手機安裝:把證書放入手機的內置或外置存儲卡上,而後經過手機的"系統安全-》從存儲設備安裝"菜單安裝證書。瀏覽器
而後找到拷貝的FiddlerRoot.cer
進行安裝便可。安裝好以後,能夠在信任的憑證中找到咱們已經安裝好的安全證書。安全
蘋果手機安裝:
- 保證手機網絡和fiddler所在機器網絡是同一個網段下的
- 在safari中訪問http://fiddle機器ip:fiddler端口,進行證書下載。而後進行安裝證書操做。
- 在手機中的設置-》通用-》關於本機-》證書信任設置-》開啓fiddler證書信任
想要使用Fiddler進行手機抓包,首先要確保手機和電腦的網絡在一個內網中,可使用讓電腦和手機都鏈接同一個路由器。固然,也可讓電腦開放WIFI熱點,手機連入。這裏,我使用的方法是,讓手機和電腦同時連入一個路由器中。最後,讓手機使用電腦的代理IP進行上網。 在手機上,點擊鏈接的WIFI進行網絡修改,添加代理。進行手動設置,ip和端口號都是fiddler機器的ip和fiddler上設置的端口號。
上述步驟都設置完成以後,用手機瀏覽器打開百度首頁,咱們就能夠順利抓包了
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
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反爬機制攔截的反應
處理方式(在配置文件中修改此條爲False)
處理方式(在配置文件中修改此條)
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)
能夠經過將終端指令的形式將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格式的文件
新建工程
scrapy startproject bosspro
cd bosspro
建立爬蟲文件
scrapy genspider boss www.baidu.com
修改兩種反爬機制
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中聲明的管道類都要在此處開啓
#將數據保存到本地 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便可