我正在尝试编写一个程序,在https://echa.europa.eu/上进行化学搜索并得到结果。“搜索化学品”字段位于主网页的中间。我想通过提供cas编号(例如),从搜索每种化学品中获得最终的URL。67-56-1)。我得到的URL似乎不包括所提供的cas编号。
sessionCriteriaId=dissSimpleSearchSessionParam101401584308302720
我尝试在"p_p_id“字段中插入不同的cas号(71-23-8),但没有给出预期的搜索结果。
我还检查了从Chrome请求的GET方法的头,这也不包括cas编号。
网站是否使用变量来存储输入查询?是否有一种方法或工具可用于获取结果URL,包括搜索can编号?
一旦解决了这个问题,我将使用Python获取数据并将其保存为excel文件。
谢谢。
发布于 2020-03-16 02:19:41
您需要通过请求主url一次获得JESSIONID cookie,然后在https://echa.europa.eu/search-for-chemicals上发送一个帖子。但这也需要一些必要的URL参数
使用卷曲和bash:
query="71-23-8"
millis=$(($(date +%s%N)/1000000))
curl -s -I -c cookie.txt 'https://echa.europa.eu/search-for-chemicals'
curl -s -L -b cookie.txt 'https://echa.europa.eu/search-for-chemicals' \
--data-urlencode "p_p_id=disssimplesearch_WAR_disssearchportlet" \
--data-urlencode "p_p_lifecycle=1" \
--data-urlencode "p_p_state=normal" \
--data-urlencode "p_p_col_id=column-1" \
--data-urlencode "p_p_col_count=2" \
--data-urlencode "_disssimplesearch_WAR_disssearchportlet_javax.portlet.action=doSearchAction" \
--data-urlencode "_disssimplesearch_WAR_disssearchportlet_backURL=https://echa.europa.eu/home?p_p_id=disssimplesearchhomepage_WAR_disssearchportlet&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=2" \
--data-urlencode "_disssimplesearchhomepage_WAR_disssearchportlet_sessionCriteriaId=" \
--data "_disssimplesearchhomepage_WAR_disssearchportlet_formDate=$millis" \
--data "_disssimplesearch_WAR_disssearchportlet_searchOccurred=true" \
--data "_disssimplesearch_WAR_disssearchportlet_sskeywordKey=$query" \
--data "_disssimplesearchhomepage_WAR_disssearchportlet_disclaimer=on" \
--data "_disssimplesearchhomepage_WAR_disssearchportlet_disclaimerCheckbox=on"使用python和使用美汤进行刮擦
import requests
from bs4 import BeautifulSoup
import time
url = 'https://echa.europa.eu/search-for-chemicals'
query = '71-23-8'
s = requests.Session()
s.get(url)
r = s.post(url,
params = {
"p_p_id": "disssimplesearch_WAR_disssearchportlet",
"p_p_lifecycle": "1",
"p_p_state": "normal",
"p_p_col_id": "column-1",
"p_p_col_count": "2",
"_disssimplesearch_WAR_disssearchportlet_javax.portlet.action": "doSearchAction",
"_disssimplesearch_WAR_disssearchportlet_backURL": "https://echa.europa.eu/home?p_p_id=disssimplesearchhomepage_WAR_disssearchportlet&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=2",
"_disssimplesearchhomepage_WAR_disssearchportlet_sessionCriteriaId": ""
},
data = {
"_disssimplesearchhomepage_WAR_disssearchportlet_formDate": int(round(time.time() * 1000)),
"_disssimplesearch_WAR_disssearchportlet_searchOccurred": "true",
"_disssimplesearch_WAR_disssearchportlet_sskeywordKey": query,
"_disssimplesearchhomepage_WAR_disssearchportlet_disclaimer": "on",
"_disssimplesearchhomepage_WAR_disssearchportlet_disclaimerCheckbox": "on"
}
)
soup = BeautifulSoup(r.text, "html.parser")
table = soup.find("table")
data = [
(
t[0].find("a").text.strip(),
t[0].find("a")["href"],
t[0].find("div", {"class":"substanceRelevance"}).text.strip(),
t[1].text.strip(),
t[2].text.strip(),
t[3].find("a")["href"] if t[3].find("a") else "",
t[4].find("a")["href"] if t[4].find("a") else "",
)
for t in (t.find_all('td') for t in table.find_all("tr"))
if len(t) > 0 and t[0].find("a") is not None
]
print(data)注意,我已经设置了时间戳参数(formDate param),以防它在服务器上被实际检查。
https://stackoverflow.com/questions/60698025
复制相似问题