我正在尝试使用python开发一个脚本,以便在特定网站上抓取一些信息用于学习目的。 我浏览了很多不同的教程和帖子,尝试从他们那里收集一些见解,它们非常有用,但仍然没有帮助我找到登录网站并使用不同关键词进行搜索的方法。
我尝试使用不同的API,例如requests
和urllib
,也许我找不到解决问题的正确方法。
登录信息设置
将登录信息发送到网站并获得回复以供将来使用
关键字设置
导入标题
设置cookiejar
从登录回复,进行搜索
在我尝试之后,它将随机工作,
import getpass
# marvin
# date:2018/2/7
# login stage preparation
def login_values():
login="https://www.****.com/login"
username = input("Please insert your username: ")
password = getpass.getpass("Please type in your password: ")
host="www.****.com"
#store login screts
data = {
"username": username,
"password": password,
}
return login,host,data
以下是从网站获取HTML文件
import requests
import random
import http.cookiejar
import socket
# Set up web scraping function to output the html text file
def webscrape(login_url,host_url,login_data,target_url):
#static values preparation
##import header
user_agents = [
***
]
agent = random.choice(user_agents)
headers={'User-agent':agent,
'Accept':'*/*',
'Accept-Language':'en-US,en;q=0.9;zh-cmn-Hans',
'Host':host_url,
'charset':'utf-8',
}
##set up cookie jar
cj = http.cookiejar.CookieJar()
#
# get the html file
socket.setdefaulttimeout(20)
s=requests.Session()
req=s.post(login_url, data=login_data)
res = s.get(target_url, cookies=cj,headers=headers)
html=res.text
return html
from bs4 import BeautifulSoup
#set up html parsing function for parsing all the list links
def getlist(keyword,loginurl,hosturl,valuesurl,html_lists):
page=1
pagenum=10# set up maximum page num
links=[]
soup=BeautifulSoup(html_lists,"lxml")
try:
for li in soup.find("div",class_="search_pager human_pager in-block").ul.find_all('li'):
target_part=soup.find_all("div",class_="search_result_single search-2017 pb25 pt25 pl30 pr30 ")
[links.append(link.find('a')['href']) for link in target_part]
page+=1
if page<=pagenum:
try:
nexturl=soup.find('div',class_='search_pager human_pager in-block').ul.find('li',class_='pagination-next ng-scope ').a['href'] #next page
except AttributeError:
print("{}'s links are all stored!".format(keyword))
return links
else:
chs_html=webscrape(loginurl,hosturl,valuesurl,nexturl)
soup=BeautifulSoup(chs_html,"lxml")
except AttributeError:
target_part=soup.find_all("div",class_="search_result_single search-2017 pb25 pt25 pl30 pr30 ")
[links.append(link.find('a')['href']) for link in target_part]
print("There is only one page")
return links
keyword="****"
myurl="https://www.****.com/search/os2?key={}".format(keyword)
chs_html=webscrape(login,host,values,myurl)
chs_links=getlist(keyword,login,host,values,chs_html)
targethtml=webscrape(login,host,values,chs_links[1])
总共有22个链接,一个页面包含19个链接,所以它应该有多个页面,如果显示结果“只有一个页面”,则表示失败。
login_values函数是通过将所有函数组合到最终函数来保护我的登录信息,但显然,用户名和密码仍然很容易通过print()
命令显示。
这个主要问题!!就像我之前提到的,这种方法是随机的。顺便说一句,我的意思是不工作,HTML文件只是登录页面而不是搜索结果。我希望得到一个更好的控制,使其在大多数时间工作。我每次都通过打印agent
检查用户代理,看看它们是否相关,但事实并非如此!我将可疑的cookie清除到完整的存储内存,但事实并非如此。
有时我遇到最大试用错误或操作系统错误,我想这是我试图达到的服务器的错误,有没有办法可以为我设置一个等待计时器来防止这些错误从发生?