本文针对复杂数据网站进行数据爬取测试,本文使用的爬虫工具是psotman,通过postman来模拟和尝试生成post连接,以找出爬虫URL的准确形式,最后将代码整合后形成完整的批量化数据爬取代码。
1.爬取ctd药物数据网站上的drug数据:
ctd数很多生物研究常常使用的大型数据库之一,但是要想每次粘贴进去4000个药物名称进行批量查询和下载,往往会导致数据库的反应时间过长,文件过大中途与服务器断开连接,同时如果想要爬取的药物数目达到几万条,则手动的输出和点击查询会显得笨拙和重复无聊!本文针对复杂的数据库网页进行爬取,实现自动化批量查询和文件写入。
2.详细流程
2.1.使用Chrome浏览器,输入网址:http://ctdbase.org/tools/batchQuery.go, 然后输入要查询的药物名称列表:此处仅给出10个供学习参考!
drug_list=
[polyethylene glycol
acetate
acetylcholine
sodium chloride
anthranilic acid
quinacrine
betaine
calcium
CO(2
citric acid],往ctd的网站中输入drug_list的信息。
2.2.先打开Chrom浏览器>点击Download>其余见下图:
双击“batchQuery.go?q”打开页面,可以找到网页中点击Download后的post表单信息:
Form Data完整的表单数据
注:画了绿色方框的地方是要在postman中提交的参数字段及其对应值。
2.3.在postman中,模仿Form Data部分构造表单数据向网页提交post请求,看是否能够返回正确的response页面,如果可以则表单数据提交正确!之后我们就可以找到批量访问数据的URL的特点,并编写Python自动化程序实现对数据进行批量查询和下载并保存成文本文件的操作。
进入postman页面,粘贴入主要的URL domain部分,然后选择“POST”,并在Params中依次填写2.2节中最后绿色框中的内容字段及其对应值,然后点击send就可以查看post提交的结果是否正确。测试成功后,就可以将整个URL的规律找到,实现一个批量自动化的数据爬取程序!
注:对于一些新版网页来说,找到要爬取的字段的规律,可以直接右键>网页源代码>通过ctrl+F来查找指定的字段及其对应的标签,最后通过beautifulsoup4来实现网页标签的快速select操作。
3.代码
# -*- coding: utf-8 -*-
#使用postman传递参数后发现正确返回了结果
"""
http://ctdbase.org/tools/batchQuery.go?inputType=chem&inputTerms=
polyethylene
glycol
acetate
acetylcholine
sodium chloride
anthranilic acid
quinacrine
betaine
calcium
CO(2
citric acid
chloride
&queryFileColumn=1&report=cgixns&actionTypes=ANY&format=tsv&action=Download
"""
import requests
import random
import time
import pandas as pd
#4个数据的选项按钮对应的Id的标签名称
inputType='chem'
#要爬取的药物的名称
drug_name=pd.read_csv('E:/drug_name112.csv')
drug_name.columns=['ChemicalID', 'drugName']
drug_name=sorted(drug_name['drugName'])
#读取可用的IP地址
Valid_IPP=pd.read_csv('E:/valid_IP.csv')
valid_IP11=[]
for i in range(len(Valid_IPP)):
zhou=Valid_IPP.loc[i,:].tolist()
valid_IP11.append(zhou)
#批量数据的爬取
def scrapy_ctd_web(drug_name,valid_IP11):
for i in range(0,len(drug_name)-120,120): #1200
#for i in range(0,120,120):
index1=i
index2=i+120
#print(index1,index2)
drugname='' #拼接第二个参数的文本
count=0
outpath='E:/scrapy_web_ctd/'+str(int(index2/120))+'.txt'
for line in drug_name[index1:index2]:
count+=1
if count==120:
drugname+=line
break
drugname+=line
drugname+='\n'
print(drugname)
#拼接构造post的URL邻接地址
new_url='http://ctdbase.org/tools/batchQuery.go?inputType='+inputType+'&inputTerms='+drugname+'&queryFileColumn=1&report=cgixns&actionTypes=ANY&format=tsv&action=Download'
header={"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gb2312, utf-8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",