Fiddler 抓包工具
配置 Fiddler
添加证书信任, Tools - Options - HTTPS, 勾选 Decrypt Https Traffic 后弹出窗口, 一路确认
...from browsers only 设置只抓取浏览器的数据包
Tools - Options - Connections, 设置监听端口(默认为 8888)
关闭 Fiddler, 再打开 Fiddler, 配置完成后重启 Fiddler(重要)
配置浏览器代理
1, 安装 Proxy SwitchyOmega 插件
2, 浏览器右上角: SwitchyOmega->选项 ->新建情景模式 ->AID1901(名字)->创建
输入 :HTTP:// 127.0.0.1 8888
点击 : 应用选项
3, 点击右上角 SwitchyOmega 可切换代理
Fiddler 常用菜单
1,Inspector : 查看数据包详细内容
整体分为请求和响应两部分
2, 常用菜单
Headers : 请求头信息
webForms: POST 请求 Form 表单数据 :<body>
GET 请求查询参数: <QueryString>
Raw 将整个请求显示为纯文本
手机设置
正常版
1, 设置手机
2, 设置 Fiddler
最后重启 Fiddler.
如果遇到问题
在计算机中 win+R, 输入 regedit 打开注册表, 找到 fiddler, 右键新建点击 OWORD(64 位)值 Q,
名称: 80; 类型: REG_DWORD; 数据: 0x00000000(0)
Fiddler 在上面的设置下, 加上: 菜单栏 Rules-->Customize Rules...-->重启 Fiddler
移动端 App 数据抓取
有道翻译手机版破解案例
- 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)
途牛旅游
目标: 完成途牛旅游爬取系统, 输入出发地, 目的地, 输入时间, 抓取热门景点信息及相关评论
地址
1, 地址: http://www.tuniu.com/
2, 热门 - 搜索
3, 选择: 相关目的地, 出发城市, 出游时间 (出发时间和结束时间) 点击确定
4, 示例地址如下:
http://s.tuniu.com/search_complex/whole-sh-0-热门/list-a{触发时间}_{结束时间}-{出发城市}-{相关目的地}/
项目实现
1, 创建项目
- scrapy startproject Tuniu
- cd Tuniu
- scrapy genspider tuniu tuniu.com
2, 定义要抓取的数据结构 - 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()
3, 爬虫文件数据分析与提取
页面地址分析
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-热门/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
4, 管道文件处理 pipelines.py
print(dict(item))
5, 设置 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-热门/'
- 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)
来源: https://www.cnblogs.com/LXP-Never/p/11492429.html