爬取Google patent上公司所有专利
需求:给出了需要爬取的公司列表,形式如下:
[‘DURATA THERAPEUTICS INC’,‘DYNAVAX TECHNOLOGIES CORP’]
要求将公司名输入到google patent的搜索框中,转至的界面里会出现下载的按钮。
通过F12可以找到Download的链接:
https://patents.google.com/xhr/query?url=assignee%3DDYNAVAX%2BTECHNOLOGIES%2BCORP%26oq%3DDYNAVAX%2BTECHNOLOGIES%2BCORP&exp=&download=true
可以看出下载连接其实是又固定前缀以及公司名称再加上固定后缀组成,所以可以直接利用requests.get来访问下载文件
r = requests.get(url,headers=headers,proxies=proxies)
fo = open(filename,'wb')
fo.write(r.content)
fo.close()
这样就可以直接将url对应的文件下载到指定文件下。
但是google patent有一定的反爬机制,针对其反爬,我分别采取了3点措施:
(1)随机ip池
(2)随机user-agent池
(3)增加每次爬取的延时,这一点特别重要,google会针对频繁请求的用户实施封禁
对应代码如下:
# 随机user-agent池
user_agent_pool = ["Mozilla/5.0 (Macintosh; U; Mac OS X Mach-O; en-US; rv:2.0a) Gecko/20040614 Firefox/3.0.0 ",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.14) Gecko/20110218 AlexaToolbar/alxf-2.0 Firefox/3.6.14",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"]
# 随机ip池
ip_pool = ['114.230.69.170:9999','61.135.155.82:443']
for company in company_list:
patent_name = 'url=assignee=' + company + '&oq=' + company + '&exp=&download=true'
url = base_url + patent_name
filename = './company_patent/' + company + '.csv'
ip = ip_pool[random.randrange(0,2)]
headers['user_agent'] = user_agent_pool[random.randrange(0,len(user_agent_pool))]
proxy_ip = 'http://'+ip
proxies = {'http':proxy_ip}
r = requests.get(url,headers=headers,proxies=proxies)
fo = open(filename,'wb')
fo.write(r.content)
fo.close()
# 我选择延迟15s,没有被封禁
time.sleep(15)
最后就可以将公司列表中所有公司的专利爬取下来了,当然公司列表是存在excel文件中的,具体的读取代码就不放上来了,全部代码请移步我的github:https://github.com/Weifanwong/google_patent_spider