使用Python进行抓取时处理Cookie

时间:2017-03-21 16:42:20

标签: python cookies beautifulsoup python-requests

我试图从大学网站的职业页面上抓取链接,我收到了这个错误。

  

urllib.error.HTTPError:HTTP错误302:HTTP服务器返回了导致无限循环的重定向错误。   最后30x错误消息是:   暂时移动

我认为这是因为该网站有会话cookie。在做了一些阅读之后,似乎有很多方法可以解决这个问题(请求,http.cookiejar,Selenium / PhantomJs),但我不知道如何将这些解决方案纳入我的抓取程序。

这是我的抓手计划。它是使用BeautifulSoup4在Python 3.6中编写的。

from bs4 import BeautifulSoup
from urllib.request import urlopen

html = urlopen("https://jobs.fanshawec.ca/applicants/jsp/shared/search/SearchResults_css.jsp")
soup = BeautifulSoup(html, 'html.parser')
data = soup.select(".ft0 a")
ads = []

for i in data:
    link = i.get('href')
    ads.append(link)

for job in ads:
    print(job)
    print('')

当我在浏览器中清除Cookie并手动转到我尝试抓取(https://jobs.fanshawec.ca/applicants/jsp/shared/search/SearchResults_css.jsp)的页面时,我会转到其他页面。一旦我有了cookie,我就可以直接进入我想要搜索的SearchResults页面。

这是cookie:

This is the cookie

有关如何处理此Cookie的任何想法?

2 个答案:

答案 0 :(得分:1)

使用requests - 模块:

from bs4 import BeautifulSoup
import requests

session = requests.Session()
req = session.get("https://jobs.fanshawec.ca/applicants/jsp/shared/search/SearchResults_css.jsp")
req.raise_for_status()  # omit this if you dont want an exception on a non-200 response
html = req.text
soup = BeautifulSoup(html, 'html.parser')
data = soup.select(".ft0 a")
ads = []

for i in data:
    link = i.get('href')
    ads.append(link)

for job in ads:
    print(job)
    print('')

但是,我没有得到任何输出,这可能是由于广告是空的。 我希望这会对你有所帮助,

答案 1 :(得分:0)

您尝试访问的网站可能正在测试Cookie和Javascript是否存在。 Python确实提供了CookieJar库,但如果javascript也是强制性的,这还不够。

相反,您可以使用Selenium来获取HTML。它有点像现有浏览器的遥控器,可以按如下方式使用:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

url = "https://jobs.fanshawec.ca/applicants/Central?delegateParameter=searchDelegate&actionParameter=showSearch&searchType=8192"

browser = webdriver.Firefox(firefox_binary=FirefoxBinary())
browser.get(url)
soup = BeautifulSoup(browser.page_source, 'html.parser')

data = soup.select(".ft0 a")
ads = []

for i in data:
    link = i.get('href')
    ads.append(link)

for job in ads:
    print(job)

(另请参阅PhantomJS的无头解决方案)

这将为您提供如下链接:

/applicants/Central?delegateParameter=applicantPostingSearchDelegate&actionParameter=getJobDetail&rowId=174604&c=%2BWIX1RV817HeJUg7cnxxnQ%3D%3D&pageLoadIdRequestKey=1490116459459&functionalityTableName=8192&windowTimestamp=null
/applicants/Central?delegateParameter=applicantPostingSearchDelegate&actionParameter=getJobDetail&rowId=174585&c=4E7TSRVJx7jLG39iR7HvMw%3D%3D&pageLoadIdRequestKey=1490116459459&functionalityTableName=8192&windowTimestamp=null
/applicants/Central?delegateParameter=applicantPostingSearchDelegate&actionParameter=getJobDetail&rowId=174563&c=EyCIe7a8xt0a%2BLp4xqtzaw%3D%3D&pageLoadIdRequestKey=1490116459459&functionalityTableName=8192&windowTimestamp=null
/applicants/Central?delegateParameter=applicantPostingSearchDelegate&actionParameter=getJobDetail&rowId=174566&c=coZCMU3091mmz%2BE7p%2BHNIg%3D%3D&pageLoadIdRequestKey=1490116459459&functionalityTableName=8192&windowTimestamp=null
/applicants

注意:要使用Selenium,您需要install it,因为它不是默认Python库的一部分:

pip install selenium