本次创作实验网站:实验网址
本次创作语言:python2
编译用到的工具:pycharm,Fiddler
首先我们打开这个网站,不难发现,在高级检索目录下的内容是需要登录后才能获取到的,所以我们需要先注册账号,进入高级检索界面,我们就可以筛选信息了,而我们现在需要爬虫去实现的功能就是在不登录的情况下,能够爬取到该页面的我们自己筛选想爬取下来的信息。
准备工作:注册该网站,并登录
第一步:进入该网站的首页:首页,
然后打开自己的抓包工具(本人使用的是FIddler),首先将FIddler页面的信息清空一下,方便等下查阅该网站的信息。
第二步:点击高级检索,进入页面,选择检索内容,本次实验暂时只选择 中国发明申请 和公开日 日期随意选择
第三步:点击检索,然后打开抓包工具,抓取网站信息,因为我们通过观察,发现这个网站的存储信息方式是通过ajax方式存储信息的,所以我们要通过获取ajax信息,从而得到我们需要的信息。
知道了这些,我们可以开始编写本次爬虫的代码了。
#coding=utf-8
import urllib2
import re
class Spider:
def loadinfo(self,n):
self.page=n //将输入的爬取页面信息存储下来
headers = { //headers信息是通过抓包工具拿下来的
"Host": "www.sooip.com.cn",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Referer": "http://www.sooip.com.cn/app/patent2",
}
fromdata = {//formdata信息通过抓包工具得到的,在存储信息的ajax网页的webfroms里
"attribute-node:patent_cache-flag": "false",
"attribute-node:patent_page": "self.page", //当前页码
"attribute-node:patent_page-row": "10", //每页显示多少信息
"attribute-node:patent_sort-column": "ano",
"attribute-node:patent_start-row": 1+10*self.page,//从第几行开始爬取
"categoryIndex": "",
"express": "(公开(公告)日 = ( 20170104 ) )",//我们当时输入的检索信息
"express2": "", //可以尝试输入其他信息来得到
"isFamily": "",
"order": "",
"patentLib": "pdb = 'CNA0' OR pdb = 'CNB0' OR pdb = 'CNY0' OR pdb = 'CNS0'",//专利选择(我们当时输入的检索信息)
"patentType": "patent2",
"pdbt": "",
"secondKeyWord": "名称+摘要+主权项",
"secondkeyWordVal": "",
"secondSearchType": "AND",
"selectedCategory": "",
//以上信息都是根据你输入的检索信息得到的,所以想实现筛选需要的信息,可以直接从这里修改
}
url = "http://www.sooip.com.cn/txnPatentData01.ajax"
//这个网站的信息是通过抓包工具得到的,因为信息是存储在ajax里,所以我们应该找到存储信息的网址
data=urllib.urlencode(fromdata)
requests = urllib2.Request(url=url,data=data,headers=headers)
response = urllib2.urlopen(requests)
html = response.read()//本次的匹配规则使用的是正则,也可以使用beautifulsoup
name = re.compile('<TIO>(.*?)</TIO>', re.S).findall(html)
shengqinghao = re.compile('<ANO>(.*?)</ANO>', re.S).findall(html)
date = re.compile('<AD>(.*?)</AD>', re.S).findall(html)
gongkaihao = re.compile('<PNO>(.*?)</PNO>', re.S).findall(html)
gongkaihri = re.compile('<PD>(.*?)</PD>', re.S).findall(html)
ren = re.compile('<APO>(.*?)</APO>', re.S).findall(html)
faming = re.compile('<INO>(.*?)</INO>', re.S).findall(html)
ipc = re.compile('<IPC>(.*?)</IPC>', re.S).findall(html)
info = re.compile('<ABSO>(.*?)</ABSO>', re.S).findall(html)
for i in range(len(name)):
# print(name[i])
content.append(name[i])//将爬取到的信息存储在该数组中
# print("申请号:%s"%(shengqinghao[i]))
content.append(shengqinghao[i])
# print(date[i])
content.append(date[i])
# print(gongkaihao[i])
content.append(gongkaihao[i])
# print(gongkaihri[i])
content.append(gongkaihri[i])
# print(ren[i])
content.append(ren[i])
# print(faming[i])
content.append(faming[i])
# print(ipc[i])
content.append(ipc[i])
# print(info[i])
content.append(info[i])
def writepage(self,content)://将该数组存储在本地文件中
for word in content:
with open("zhuangli.txt","a") as f:
f.write(word+'\n')
if __name__ == "__main__":
n=(input("请输入需要爬取的页码:"))
xuexi=Spider()
content=[]
for i in range(n):
xuexi.loadinfo(i)
print("第%s页爬取完成"%(i+1))
xuexi.writepage(content)
如有问题,请在下方评论,欢迎斧正,谢谢!