问题场景
最近的项目需要抓取一些公开的网站数据,本文利用Python3下的requests方法举一个简单例子。
环境介绍
Windows
Python3.6
IDEA15
Chrome
目标
本文试图抓取一个公开网站下搜索到的数据:http://dbsearch.clinicalgenome.org/search/
思路
- 打开Chrome浏览器,输入网址
- 输入查询条件,并点击按钮
- 右键->检查->Elements->点击箭头选取一个数据,观察前台显示的数据在哪个标签层级下,方便后续清洗
- 右键->检查->Network 得到一些cookie等必备头部信息,作为参数
- 清洗request的payload信息,拼成json串
- 使用requests.post方法提交抓取源数据
关键步骤
3 右键->检查->Elements->点击箭头选取一个数据,观察前台显示的数据在哪个标签层级下,方便后续清洗
上图蓝色背景内的第二列是表格内的数据,也是我们要的数据
4 右键->检查->Network 得到一些cookie等必备头部信息
5 清洗request的payload信息,拼成json串
payload = {
‘GenomeBuild’: ‘hg19’,
‘Location’: ‘chrX:70367400-70384667’,
‘DirectView’: ‘View in …’,
‘Type’: ‘Any’,
‘Gender’: ‘Any’,
‘HPOTerm’: ”,
‘Task’: ‘Search ISCA Database’,
‘pheno_btn_style’: ”,
}
CODE
from bs4 import BeautifulSoup
import requests
def get_isca(url, headers, payload):
page = requests.post(url, data=payload, headers=headers).text
soup = BeautifulSoup(page, 'lxml')
links = soup.select('td.results_2')
i = 0
for link in links:
print(link.text)
i += 1
if (i % 8 == 0):
print('================')
links = soup.select('td.results_1')
i = 0
for link in links:
print(link.text)
i += 1
if (i % 8 == 0):
print('================')
if __name__ == '__main__':
url = 'http://dbsearch.clinicalgenome.org/search/'
headers = {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'X-Mapping-eeipplmp=4DF199590E46B78FBFB31AEB1821707A',
'Referer': 'http://dbsearch.clinicalgenome.org/search/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36'
}
payload = {
'GenomeBuild': 'hg19',
'Location': 'chrX:70367400-70384667',
'DirectView': 'View in ...',
'Type': 'Any',
'Gender': 'Any',
'HPOTerm': '',
'Task': 'Search ISCA Database',
'pheno_btn_style': '',
}
get_isca(url, headers, payload)
输出
可以看出包括Location列在内的数据都被抓到了。