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. Python入门-Hello Word

    1.python语言介绍 Python创始人:Guido Van Rossum 2.python是一种解释型.动态类型计算机程序设计语言. 解释型:程序无需编译成二进制代码,而是在执行时对语句一条一条 ...

  2. Yii1.1框架实现PHP极光推送消息通知

    一.下载极光推送PHP SDK,解压后放在/protected/components/目录下,如下图所示: 二.完善修改下官方的demo例子,我这里复制一份demo,改为NotifyPush.php, ...

  3. l^oo不可分的两个注意点

    1  不理解等一个等式 , 2.不理解为什么,一个可分的集合里面有不可数的子集?谢谢 1是 2.是可分集合里面每个元素 做中心后的一个开覆盖 所有0 1序列是和所有二进制小数   可以一一对应   而 ...

  4. SOAP UI-----测webservice接口

    webservice的请求报文和返回报文都是xml格式的. 使用soapui.storm对webservice接口进行测试,postman无法测. http://www.webxml.com.cn/W ...

  5. shell脚本--编写CGI代码(shell结合html)以及环境变量

    实现shell和html标签混合的方式编写代码: 推荐  初始CGI ,看完大概之后,大概对cgi有个大体的印象.下面是编写混合代码的示例: #!/bin/bash #index.cgi echo & ...

  6. PAT L2-023 图着色问题

    https://pintia.cn/problem-sets/994805046380707840/problems/994805057298481152 图着色问题是一个著名的NP完全问题.给定无向 ...

  7. HTTL之初印象

    概述 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. 简洁 ...

  8. apach ab 安装时的错误

    1.cmd进入bin下:执行httpd -k install 需要管理员 登陆安装 我们打开conf文件夹,找到httpd.conf,修改如下内容,让serverroot指向你的安装位置: Defin ...

  9. Spring boot 将配置文件属性注入到一个bean中

    现在要做的就是将如下配置文件中的内容注入到一个bean 名为Properties中. Redis.properties配置文件中的内容如下: Properties java bean中代码如下,注意注 ...

  10. k8s容器的资源限制

    1.k8s支持内存和cpu的限制 requests:容器运行需求,最低保障limits:限制,硬限制(资源上限) CPU: 1颗逻辑CPU(1核CPU=4个逻辑CPU) 1物理核=1000个微核(mi ...