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爬虫的更多相关文章

  1. Python爬虫入门教程 41-100 Fiddler+夜神模拟器+雷电模拟器配置手机APP爬虫部分

    爬前叨叨 从40篇博客开始,我将逐步讲解一下手机APP的爬虫,关于这部分,我们尽量简化博客内容,在这部分中可能涉及到一些逆向,破解的内容,这部分尽量跳过,毕竟它涉及的东西有点复杂,并且偏离了爬虫体系太 ...

  2. APP爬虫(2)把小姐姐的图片down下来

    APP爬虫(1)想学新语言,又没有动力,怎么办? 书接上文.使用appium在帖子列表界面模拟上划动作,捕捉不到列表的规律.上划结束后,列表只能获取到屏幕呈现的部分,而且下标还是从0开始的. 根据酸奶 ...

  3. python写的百度图片爬虫

    学了一下python正则表达式,写一个百度图片爬虫玩玩. 当技术遇上心术不正的人,就成我这样的2B青年了. python3.6开发.程序已经打包好,下载地址: http://pan.baidu.com ...

  4. 百度APP移动端网络深度优化实践分享(二):网络连接优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...

  5. 百度APP移动端网络深度优化实践分享(一):DNS优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<一>DNS优化>,感谢原作者的无私分享. 一.前言 网络优化是客户端几大技术方 ...

  6. 全面超越Appium,使用Airtest超快速开发App爬虫

    想开发网页爬虫,发现被反爬了?想对 App 抓包,发现数据被加密了?不要担心,使用 Airtest 开发 App 爬虫,只要人眼能看到,你就能抓到,最快只需要2分钟,兼容 Unity3D.Cocos2 ...

  7. Ruby用百度搜索爬虫

    Ruby用百度搜索爬虫 博主ruby学得断断续续,打算写一个有点用的小程序娱乐一下,打算用ruby通过百度通道爬取网络信息. 第三方库准备 mechanize:比较方便地处理网络请求,类似于Pytho ...

  8. app自动化测试之实战应用(百度app简单测试)

    模拟在百度app中搜索python相关内容代码如下: from appium import webdriver desired_caps = {} desired_caps['deviceName'] ...

  9. Appium+python自动化2-启动百度app

    一.前言 上一章节环境已经搭建好了,接下来就是需要启动APP,如何启动app呢?首先要获取包名,然后获取launcherActivity.获取这两个关键东西的方法很多,这里就不一一多说,小伙伴们可以各 ...

随机推荐

  1. Random()种子数

    Random rand =new Random(25); int i; i=rand.nextInt(100); 初始化时25并没有起直接作用,rand.nextInt(100);中的100是随机数的 ...

  2. 出题人的女装(牛客练习赛38题B) (概率+分式运算)

    链接:https://ac.nowcoder.com/acm/contest/358/B来源:牛客网 出题人的女装 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  3. semantic-ui 下拉框

    注意:在使用semantic的下拉框的时候,不仅需要引入semantic.css,还要引入semantic.js,最重要的是引入jquery.否则下拉效果不会显示. 并且,jquery必须先于sema ...

  4. PAT L3-010 是否完全二叉搜索树

    https://pintia.cn/problem-sets/994805046380707840/problems/994805049870368768 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  5. 测试工具之ab

    ab命令原理  Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力.  ab命令对发出负载的计算机要求很低,既不会占 ...

  6. react render

    实际上react render方法返回一个虚拟dom 并没有去执行渲染dom 渲染的过程是交给react 去完成的 这就说明了为什么要在所有数据请求完成后才去实现render 这样做也提高了性能.只调 ...

  7. Laravel 5.2+ 使用url()全局函数返回前一个页面的地址

    注意:文章标题中5.2+表示该文章内容可向上兼容,适用于Laravel版本5.2及更高(目前最新为5.6),但不可向下兼容,即不适用于5.2版本以下.推荐大家花一点点时间,将自己的Laravel更新至 ...

  8. CentOS7 网络NAT模式

    问题:安装完毕ping命令不能用,然后改为桥接模式,ping可以用. 先了解桥接,NAT 的含义. 桥接:在bridged模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访 ...

  9. SimpleChannelInboundHandler与ChannelInboundHandlerAdapter

    参考https://blog.csdn.net/u011262847/article/details/78713881 每一个Handler都一定会处理出站或者入站(也可能两者都处理)数据,例如对于入 ...

  10. C#中List<T>排序

    在面向对象开发过程中我们经常将一组对象放到一个特定集合中,此时我们通常使用泛型集合来存放,常见的如:List.Dictionary等.在使用这些泛型集合时我们有时需要对其进行排序,下面我们就一起学习下 ...