用于 USPTO 网站抓取的 Python 发布请求
Posted
技术标签:
【中文标题】用于 USPTO 网站抓取的 Python 发布请求【英文标题】:Python post request for USPTO site scraping 【发布时间】:2017-07-25 15:11:32 【问题描述】:我正在尝试从 http://portal.uspto.gov/EmployeeSearch/ 网站上抓取数据。 我在浏览器中打开该站点,单击该站点的“按组织搜索”部分内的“搜索”按钮,然后查找正在发送到服务器的请求。
当我在我的程序中使用 python 请求库发布相同的请求时,我没有得到我期望的结果页面,但我得到了相同的搜索页面,其中没有员工数据。 我尝试了所有变体,似乎没有任何效果。
我的问题是,我应该在我的请求中使用什么 URL,我是否需要指定标头(也尝试过,根据请求在 Firefox 开发人员工具中查看的复制标头)或其他内容?
下面是发送请求的代码:
import requests
from bs4 import BeautifulSoup
def scrape_employees():
URL = 'http://portal.uspto.gov/EmployeeSearch/searchEm.do;jsessionid=98BC24BA630AA0AEB87F8109E2F95638.prod_portaljboss4_jvm1?action=displayResultPageByOrgShortNm¤tPage=1'
response = requests.post(URL)
site_data = response.content
soup = BeautifulSoup(site_data, "html.parser")
print(soup.prettify())
if __name__ == '__main__':
scrape_employees()
【问题讨论】:
如果可能,您应该使用 API 而不是屏幕抓取。 USPTO API 记录在 here。 感谢@ThisSuitIsBlackNot 的建议。不幸的是,我无法从 USPTO 的 API 中获取我需要的所有数据(员工姓名)...... 那太糟糕了。无论如何,您似乎忘记在请求正文中输入orgShortNm=foo
。
【参考方案1】:
您需要的所有数据都在form
标签中:
action
是您向服务器发帖时的 url。
input
是您需要发布到服务器的数据。 name:value
import requests, bs4, urllib.parse,re
def make_soup(url):
r = requests.get(url)
soup = bs4.BeautifulSoup(r.text, 'lxml')
return soup
def get_form(soup):
form = soup.find(name='form', action=re.compile(r'OrgShortNm'))
return form
def get_action(form, base_url):
action = form['action']
# action is reletive url, convert it to absolute url
abs_action = urllib.parse.urljoin(base_url, action)
return abs_action
def get_form_data(form, org_code):
data =
for inp in form('input'):
# if the value is None, we put the org_code to this field
data[inp['name']] = inp['value'] or org_code
return data
if __name__ == '__main__':
url = 'http://portal.uspto.gov/EmployeeSearch/'
soup = make_soup(url)
form = get_form(soup)
action = get_action(form, url)
data = get_form_data(form, '1634')
# make request to the action using data
r = requests.post(action, data=data)
【讨论】:
以上是关于用于 USPTO 网站抓取的 Python 发布请求的主要内容,如果未能解决你的问题,请参考以下文章