配置Fiddlerhtml
配置瀏覽器代理json
一、安裝Proxy SwitchyOmega插件
二、瀏覽器右上角:SwitchyOmega->選項->新建情景模式->AID1901(名字)->建立
輸入 :HTTP:// 127.0.0.1 8888
點擊 :應用選項
三、點擊右上角SwitchyOmega可切換代理api
Fiddler經常使用菜單瀏覽器
一、Inspector :查看數據包詳細內容
總體分爲請求和響應兩部分
二、經常使用菜單
Headers :請求頭信息
WebForms: POST請求Form表單數據 :<body>
GET請求查詢參數: <QueryString>
Raw 將整個請求顯示爲純文本數據結構
正常版app
一、設置手機dom
二、設置Fiddlerscrapy
最後重啓Fiddler。ide
若是遇到問題工具
在計算機中win+R,輸入regedit打開註冊表,找到fiddler,右鍵新建點擊OWORD(64位)值Q,
名稱:80;類型:REG_DWORD;數據:0x00000000(0)
Fiddler在上面的設置下,加上:菜單欄Rules-->Customize Rules...-->重啓Fiddler
import requests from lxml import etree word = input('請輸入要翻譯的單詞:') url = 'http://m.youdao.com/translate' data = { 'inputtext': word, 'type': 'AUTO', } html = requests.post(url,data=data).text parse_html = etree.HTML(html) result = parse_html.xpath('//ul[@id="translateResult"]/li/text()')[0] print(result)
目標:完成途牛旅遊爬取系統,輸入出發地、目的地,輸入時間,抓取熱門景點信息及相關評論
地址
一、地址: http://www.tuniu.com/
二、熱門 - 搜索
三、選擇: 相關目的地、出發城市、出遊時間(出發時間和結束時間)點擊肯定
四、示例地址以下:
http://s.tuniu.com/search_complex/whole-sh-0-%E7%83%AD%E9%97%A8/list-a{觸發時間}_{結束時間}-{出發城市}-{相關目的地}/
一、建立項目
scrapy startproject Tuniu
cd Tuniu
scrapy genspider tuniu tuniu.com
二、定義要抓取的數據結構 - items.py
# 一級頁面 # 標題 + 連接 + 價格 + 滿意度 + 出遊人數 + 點評人數 + 推薦景點 + 供應商 title = scrapy.Field() link = scrapy.Field() price = scrapy.Field() satisfaction = scrapy.Field() travelNum = scrapy.Field() reviewNum = scrapy.Field() recommended = scrapy.Field() supplier = scrapy.Field() # 二級頁面 # 優惠券 + 產品評論 coupons = scrapy.Field() cp_comments = scrapy.Field()
三、爬蟲文件數據分析與提取
頁面地址分析
http://s.tuniu.com/search_complex/whole-sh-0-熱門/list-a20190828_20190930-l200-m3922/
# 分析
list-a{出發時間_結束時間-出發城市-相關目的地}/
# 如何解決?
提取 出發城市及目的地城市的字典,key爲城市名稱,value爲其對應的編碼
# 提取字典,定義config.py存放
代碼實現
# -*- coding: utf-8 -*- import scrapy from ..config import * from ..items import TuniuItem import json class TuniuSpider(scrapy.Spider): name = 'tuniu' allowed_domains = ['tuniu.com'] def start_requests(self): s_city = input('出發城市:') d_city = input('相關目的地:') start_time = input('出發時間(20190828):') end_time = input('結束時間(例如20190830):') s_city = src_citys[s_city] d_city = dst_citys[d_city] url = 'http://s.tuniu.com/search_complex/whole-sh-0-%E7%83%AD%E9%97%A8/list-a{}_{}-{}-{}'.format(start_time,end_time,s_city, d_city) yield scrapy.Request(url, callback=self.parse) def parse(self, response): # 提取全部景點的li節點信息列表 items = response.xpath('//ul[@class="thebox clearfix"]/li') for item in items: # 此處是否應該在for循環內建立? tuniuItem = TuniuItem() # 景點標題 + 連接 + 價格 tuniuItem['title'] = item.xpath('.//span[@class="main-tit"]/@name').get() tuniuItem['link'] = 'http:' + item.xpath('./div/a/@href').get() tuniuItem['price'] = int(item.xpath('.//div[@class="tnPrice"]/em/text()').get()) # 判斷是否爲新產品 isnews = item.xpath('.//div[@class="new-pro"]').extract() if not len(isnews): # 滿意度 + 出遊人數 + 點評人數 tuniuItem['satisfaction'] = item.xpath('.//div[@class="comment-satNum"]//i/text()').get() tuniuItem['travelNum'] = item.xpath('.//p[@class="person-num"]/i/text()').get() tuniuItem['reviewNum'] = item.xpath('.//p[@class="person-comment"]/i/text()').get() else: tuniuItem['satisfaction'] = '新產品' tuniuItem['travelNum'] = '新產品' tuniuItem['reviewNum'] = '新產品' # 包含景點+供應商 tuniuItem['recommended'] = item.xpath('.//span[@class="overview-scenery"]/text()').extract() tuniuItem['supplier'] = item.xpath('.//span[@class="brand"]/span/text()').extract() yield scrapy.Request(tuniuItem['link'], callback=self.item_info, meta={'item': tuniuItem}) # 解析二級頁面 def item_info(self, response): tuniuItem = response.meta['item'] # 優惠信息 coupons = ','.join(response.xpath('//div[@class="detail-favor-coupon-desc"]/@title').extract()) tuniuItem['coupons'] = coupons # 想辦法獲取評論的地址 # 產品點評 + 酒店點評 + 景點點評 productId = response.url.split('/')[-1] # 產品點評 cpdp_url = 'http://www.tuniu.com/papi/tour/comment/product?productId={}'.format(productId) yield scrapy.Request(cpdp_url, callback=self.cpdp_func, meta={'item': tuniuItem}) # 解析產品點評 def cpdp_func(self, response): tuniuItem = response.meta['item'] html = json.loads(response.text) comment = {} for s in html['data']['list']: comment[s['realName']] = s['content'] tuniuItem['cp_comments'] = comment yield tuniuItem
四、管道文件處理 pipelines.py
print(dict(item))
五、設置settings.py
tools.py
# 出發城市 # 基準xpath表達式 //*//*[@id="niuren_list"]/div[2]/div[1]/div[2]/div[1]/div/div[1]/dl/dd/ul/li[contains(@class,"filter_input")]/a name : ./text() code : ./@href [0].split('/')[-1].split('-')[-1] # 目的地城市 # 基準xpath表達式 //*[@id="niuren_list"]/div[2]/div[1]/div[2]/div[1]/div/div[3]/dl/dd/ul/li[contains(@class,"filter_input")]/a name : ./text() code : ./@href [0].split('/')[-1].split('-')[-1]
代碼實現
import requests from lxml import etree url = 'http://s.tuniu.com/search_complex/whole-sh-0-%E7%83%AD%E9%97%A8/' headers = {'User-Agent':'Mozilla/5.0'} html = requests.get(url,headers=headers).text parse_html = etree.HTML(html) # 獲取出發地字典 # 基準xpath li_list = parse_html.xpath('//*[@id="niuren_list"]/div[2]/div[1]/div[2]/div[1]/div/div[3]/dl/dd/ul/li[contains(@class,"filter_input")]/a') src_citys = {} dst_citys = {} for li in li_list: city_name_list = li.xpath('./text()') city_code_list = li.xpath('./@href') if city_name_list and city_code_list: city_name = city_name_list[0].strip() city_code = city_code_list[0].split('/')[-1].split('-')[-1] src_citys[city_name] = city_code print(src_citys) # 獲取目的地字典 li_list = parse_html.xpath('//*[@id="niuren_list"]/div[2]/div[1]/div[2]/div[1]/div/div[1]/dl/dd/ul/li[contains(@class,"filter_input")]/a') for li in li_list: city_name_list = li.xpath('./text()') city_code_list = li.xpath('./@href') if city_name_list and city_code_list: city_name = city_name_list[0].strip() city_code = city_code_list[0].split('/')[-1].split('-')[-1] dst_citys[city_name] = city_code print(dst_citys)