百度APP爬虫
1.抓包
访问一个频道,Charles抓包,找到真实连接,一般返回json数据和网页中数据对应为真实连接
请求方式为post,所以要添加请求头和表单数据,由于在charles环境下,所以要添加charles的代理ip和认证文件,然后进行测试,访问成功。
对不同的频道分别经过charles抓包,发现请求的链接都是一样的,只是更换了表单中tab_id属性来对应不同的频道,所以创建一个存储tab_id和频道名的字典,更换时从tab_id字典中取值,来实现不同频道的访问
2.封ip测试
一直访问并没有被封,所以就放开了采吧
3.概览页
一般概览页的数据库中存放文章的链接,但是这个百度APP返回数据中含有所有字段,所以将返回的数据全部存放到数据库中。
4.细览页
读取概览页数据库中的数据,通过正则解析出各个字段,去除无效信息,字段加密存放到数据库中
注:charles代理ip自行设置;url只提供一个样子,自行抓取;数据库自行设置;认证文件自行设置;表单数据自行抓取;数据解析模块需要什么自己就解析什么,这里不提供了;处理上还不是很完美,自行修改;
gailanye.py
import requests
import re
import time
import pymysql class BD(object):
def __init__(self):
self.url = 'https://mbd.baidu.com/searchbox?-此处省略-7ig'
self.form = {
'data': '''此处省略。。。 ''' }
self.proxy = {
'https': 'https://此处省略'
}
self.channel = {
'': '推荐',
'': '娱乐',
'': '体育',
'': '时尚',
'': '国际',
'': '热点',
'': '汽车',
'': '军事',
'': '科技',
'': '财经',
'': '游戏',
'': '女人',
'': '历史',
'': '搞笑',
'': '情感',
'': '美食',
'': '居家',
'': '政务',
'': '旅游',
'': '辟谣',
'': '健康',
'': '萌宠',
'': '新华社',
'': '虎扑',
'': '澎湃新闻',
'': '人民日报',
'': '36氪',
'': '虎嗅',
'': '上海',
'': '广州',
'': '深圳',
'': '天津',
'': '杭州',
'': '南京',
'': '武汉',
'': '北京',
} def modify_tab_id(self, tab_id):
# 修改表单中的tab_id
self.form['data'] = re.sub('"tab_id": "(\d+)"', '"tab_id": "{}"'.format(tab_id), self.form['data'])
# self.form['data'] = re.sub('"last_update_time": (\d+),', '"last_update_time": {}000,'.format(int(time.time())), self.form['data'])
return self.form['data'] def get_data(self):
# 获得频道和内容
list_d = []
for data in self.channel:
data_channel = []
print('='*20)
print(data)
self.form['data'] = self.modify_tab_id(data)
response = requests.post(self.url, data=self.form, proxies=self.proxy, verify='*.pem')
datas = response.text
channel = self.channel[data]
data_channel = [channel, datas]
print(data_channel)
list_d.append(data_channel)
return list_d def save_data(self, list_d):
# 写入数据库
host = '127.0.0.1'
db = 'bd'
user = 'root'
psd = ''
charset = 'utf8' con = pymysql.connect(host=host, db=db, user=user, passwd=psd, charset=charset) cur = con.cursor() for i in list_d:
print(i)
sql = (
"insert into gly(此处省略)"
"values(此处省略)")
list_m = [i[0], i[1]] # i[0]为频道名 i[1]为数据
try:
cur.execute(sql, list_m)
print('insert success')
except Exception as e:
print('insert error', e)
con.rollback()
else:
con.commit()
cur.close()
con.close() if __name__ == '__main__':
bd = BD()
list_d = bd.get_data()
bd.save_data(list_d)
xilanye.py
import pymysql
import json
import time
import hashlib
import requests
from lxml import etree
import re # 娱乐频道先删除掉
# 体育频道有导航栏目前还无法获取data,先过滤掉 class XLY(object):
def __init__(self):
self.no_results_channel = [] # 存储没有数据的频道
self.proxy = {
'https': '....'
}
self.sum_data = 0 def get_data(self):
host = '127.0.0.1'
db = 'bd'
user = 'root'
pwd = ''
charset = 'utf8'
con = pymysql.connect(host=host, db=db, user=user, passwd=pwd, charset=charset) datas = []
cur = con.cursor()
sql = 'select * from gly'
try:
cur.execute(sql)
results = cur.fetchall()
i = 0
for result in results:
i += 1
data = []
# 读出来是元组类型,转化为列表返回
result = list(result)
if '{"100":[]}' in result[1]:
self.no_results_channel.append(result[0])
print('no results channel:', result[0])
elif 'navigatorItems' in result[1]:
print('有导航栏的频道,还没有处理')
else:
data = [result[0], result[1]]
datas.append(data)
print('get_data')
print('=' * 20, i)
# if i == 5:
# break
except Exception as e:
print('error', e)
con.rollback()
else:
con.commit()
return datas def parse_data(self, datas):
items = []
for data in datas:
channel = data[0]
channel_data = data[1]
channel_data = json.loads(channel_data)
channel_data = channel_data['data']['']['itemlist']['items'] for text in channel_data:
print('='*20)
item = {}
try:
mode = text['data']['mode']
except:
mode = ''
print('mode not found')
# 根据mode判断是否为文章,过滤掉图集广告
if mode == 'text':
此处省略 m1 = hashlib.md5()
m1.update(item['urlname'].encode("utf8"))
item['hkey'] = m1.hexdigest() try:
item['comments'] = text['data']['comment_num'][:-2]
except:
item['comments'] = ''
print('no comment_num') # 解析content
content, url_time = self.parse_content(item['urlname'])
print(item)
self.save_data(item)
if item != {}:
items.append(item)
return items def parse_content(self, url):
# 根据每一篇文章获取content, url_time
response = requests.get(url, proxies=self.proxy, verify='此处省略.pem')
text = response.text
element = etree.HTML(text)
contents = element.xpath('//p[@class="contentText contentSize contentPadding"]//text()')
url_time = element.xpath('//div[@class="infoSet"]//text()')
try:
if '17-' in url_time:
url_time = re.sub('', '', url_time)
print(url_time)
else:
url_time = '2018-' + str(url_time[1])
except:
url_time = ''
if not contents:
contents = ''
else:
contents = ''.join(contents)
return contents, url_time def save_data(self, item):
host = '127.0.0.1'
db = 'bd'
user = 'root'
pwd = ''
charset = 'utf8' con = pymysql.connect(host=host, db=db, user=user, passwd=pwd, charset=charset)
cur = con.cursor()
sql = 'insert into xly(此处省略)' \
'values(此处省略)'
list = [此处省略]
try:
cur.execute(sql, list)
print('insert success')
self.sum_data += 1
print('成功插入数据库第{}条'.format(self.sum_data))
except Exception as e:
print('error~~', e)
con.rollback()
else:
con.commit()
# cur.execute(sql, list)
cur.close()
con.close() if __name__ == '__main__':
xly = XLY()
datas = xly.get_data()
items = xly.parse_data(datas)
百度APP爬虫的更多相关文章
- Python爬虫入门教程 41-100 Fiddler+夜神模拟器+雷电模拟器配置手机APP爬虫部分
爬前叨叨 从40篇博客开始,我将逐步讲解一下手机APP的爬虫,关于这部分,我们尽量简化博客内容,在这部分中可能涉及到一些逆向,破解的内容,这部分尽量跳过,毕竟它涉及的东西有点复杂,并且偏离了爬虫体系太 ...
- APP爬虫(2)把小姐姐的图片down下来
APP爬虫(1)想学新语言,又没有动力,怎么办? 书接上文.使用appium在帖子列表界面模拟上划动作,捕捉不到列表的规律.上划结束后,列表只能获取到屏幕呈现的部分,而且下标还是从0开始的. 根据酸奶 ...
- python写的百度图片爬虫
学了一下python正则表达式,写一个百度图片爬虫玩玩. 当技术遇上心术不正的人,就成我这样的2B青年了. python3.6开发.程序已经打包好,下载地址: http://pan.baidu.com ...
- 百度APP移动端网络深度优化实践分享(二):网络连接优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...
- 百度APP移动端网络深度优化实践分享(一):DNS优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<一>DNS优化>,感谢原作者的无私分享. 一.前言 网络优化是客户端几大技术方 ...
- 全面超越Appium,使用Airtest超快速开发App爬虫
想开发网页爬虫,发现被反爬了?想对 App 抓包,发现数据被加密了?不要担心,使用 Airtest 开发 App 爬虫,只要人眼能看到,你就能抓到,最快只需要2分钟,兼容 Unity3D.Cocos2 ...
- Ruby用百度搜索爬虫
Ruby用百度搜索爬虫 博主ruby学得断断续续,打算写一个有点用的小程序娱乐一下,打算用ruby通过百度通道爬取网络信息. 第三方库准备 mechanize:比较方便地处理网络请求,类似于Pytho ...
- app自动化测试之实战应用(百度app简单测试)
模拟在百度app中搜索python相关内容代码如下: from appium import webdriver desired_caps = {} desired_caps['deviceName'] ...
- Appium+python自动化2-启动百度app
一.前言 上一章节环境已经搭建好了,接下来就是需要启动APP,如何启动app呢?首先要获取包名,然后获取launcherActivity.获取这两个关键东西的方法很多,这里就不一一多说,小伙伴们可以各 ...
随机推荐
- H5 14-后代选择器和子元素选择器
14-后代选择器和子元素选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- maven新建项目
选择新建maven project 这个文件通常作为父工程,用于管理jar包的依赖,锁定jar包版本 选择next group id :如表面意思 组织名 公司名 artifact id :工 ...
- POJ - 3468 线段树区间修改,区间求和
由于是区间求和,因此我们在更新某个节点的时候,需要往上更新节点信息,也就有了tree[root].val=tree[L(root)].val+tree[R(root)].val; 但是我们为了把懒标记 ...
- Day11 Python基础之装饰器(高级函数)(九)
在python中,装饰器.生成器和迭代器是特别重要的高级函数 https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...
- Lombok 安装、入门以及使用
lombok 的官方网址:http://projectlombok.org/ lombok 安装 使用 lombok 是需要安装的,如果不安装,IDE 则无法解析 lombok 注解.先在官网下 ...
- p141一致有界原则
1.Mk取sup 为什么只要取∩就好了 不应该是先并后交吗 2.为什么说是闭集?
- jmeter压测
一般压测时间:10-15分钟 这些并发用户一直在请求. 稳定性测试:一周 2天 衡量性能好坏的指标: tps 服务端每秒钟能处理的请求数 rt响应时间 就是你从发出请求到服务器端返回所需的时间. ...
- O(N) 求数组中最大子串和
int MaxSubSum3(int *arr, int len) { int i; long long MaxSum = 0; long long CurSum = 0; for(int i = 0 ...
- Linux 下面RPM 安装的SQLSERVER 修改字符集的方法
1. 自己还是太low 2. 遇到问题 先 -h 处理 3. 发现登录报错, 怀疑是字符集的问题: 4. 计划是修改字符集 到 自己的环境可用的状态 使用命令 /opt/mssql/bin/mssql ...
- Button按钮为什么无缘无故会提交form表单?
我的form表单里有好几个Button按钮,每个按钮有不同的功能,可是这些按钮居然都有提交功能,真是把我惊呆了 <button class="btn btn-info " o ...