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. H5 70-清除浮动方式五

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 关于getHibernateTemplate().get()方法

    返回的对象值唯一,方法带有两个参数 第一个是意图查询实体的Class 如User.Class  ;第二个参数是该实体在数据库中对应的主键值,而且参数的类型要和映射文件相对应. 如 Role role ...

  3. c#中用sql存储过程

    string connstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionStri ...

  4. spring实例入门

    首先是bean文件: package onlyfun.caterpillar; public class HelloBean {    private String helloWord = " ...

  5. vim 永久添加行号

    sudo vi /etc/vim/vimrc 打开vimrc文件,最下面添加set nu,保存就可以添加行号了,set autoindent是自动换行

  6. 【Python3练习题 010】将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

    #参考http://www.cnblogs.com/iderek/p/5959318.html n = num = int(input('请输入一个数字:'))  #用num保留初始值 f = []  ...

  7. C++常用宏

    宏是由 #define 定义而来,在预处理阶段进行宏展开,它的格式是: #define N 2 + 2 // 仅仅是字符串替换 #define N (2 + 2) // 也是字符串 ,但是是(2 + ...

  8. v-router几种定义方式

    第一种 const router = new VueRouter({ routes: [{ path: '/newSongs', component: require('../views/NewSon ...

  9. day 7-7 线程池与进程池

    一. 进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这 ...

  10. Hbase存储模式

    以key.value的结构存储数据;  (table,rowkey,family,colum,timestamp)构成数据的key,value存储数据