【问题标题】:How can I scrape the title of different jobs from a website using requests?如何使用请求从网站上抓取不同职位的标题?
【发布时间】:2020-06-14 14:49:55
【问题描述】:

我正在尝试使用 requests 模块在 python 中创建一个脚本,以从网站上抓取不同工作的标题。要解析不同工作的标题,我需要先从该站点获取相关响应,以便我可以使用 BeautifulSoup 处理内容。但是,当我运行以下脚本时,我可以看到该脚本生成的 gibberish 实际上不包含我要查找的标题。

website link(In case you don't see any data, make sure to refresh the page)

我试过了:

import requests
from bs4 import BeautifulSoup

link = 'https://www.alljobs.co.il/SearchResultsGuest.aspx?'

query_string = {
    'page': '1',
    'position': '235',
    'type': '',
    'city': '',
    'region': ''
}

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
    s.headers.update({"Referer":"https://www.alljobs.co.il/SearchResultsGuest.aspx?page=2&position=235&type=&city=&region="})
    res = s.get(link,params=query_string)
    soup = BeautifulSoup(res.text,"lxml")
    for item in soup.select(".job-content-top [class^='job-content-top-title'] a[title]"):
        print(item.text)

我什至试过这样:

import urllib.request
from bs4 import BeautifulSoup
from urllib.parse import urlencode

link = 'https://www.alljobs.co.il/SearchResultsGuest.aspx?'

query_string = {
    'page': '1',
    'position': '235',
    'type': '',
    'city': '',
    'region': ''
}

headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36",
    "Referer":"https://www.alljobs.co.il/SearchResultsGuest.aspx?page=2&position=235&type=&city=&region="  
}

def get_content(url,params):
    req = urllib.request.Request(f"{url}{params}",headers=headers)
    res = urllib.request.urlopen(req).read()
    soup = BeautifulSoup(res,"lxml")
    for item in soup.select(".job-content-top [class^='job-content-top-title'] a[title]"):
        yield item.text

if __name__ == '__main__':
    params = urlencode(query_string)
    for item in get_content(link,params):
        print(item)

如何使用请求获取不同作业的标题?

PS 浏览器模拟器不是执行此任务的选项。

【问题讨论】:

  • 这不是乱码,而是 Js 代码,经过缩小和混淆。恐怕您无法避免 Selenium,除非您可以对 JS 代码进行逆向工程。
  • 柠檬林和杰克弗利廷似乎设法用您的代码获得了最终的 html。我会向他们询问更多详细信息,也许这与操作系统或 IP 位置有关。

标签: python python-3.x web-scraping beautifulsoup python-requests


【解决方案1】:

我想看看你的胡言乱语是什么样的。当我运行你的代码时,我得到了一堆希伯来语字符(不足为奇,因为网站是希伯来语)和职位:

לחברת הייטק מובילה,IT 项目经理 דרושים AllStars-IT Group (MT) אלעד מערכות מגייסת מפתח /ת JAVA לגוף רפואי גדול היושב בתל אביב! דרושים אלעד מערכות מנתח /ת מערכות ומאפיין /ת דרושים מרטנס הופמן שירותי מחשוב אנשי /נשות תפעול ותמיכה טכנית למוצר אינטרנטי דרושים המימד השלישי 数据库管理员/ORACLE דרושים CPS 工作 דרושים /ות אנשי /נשות תמיכה על מערכת פריוריטי, שכר מתגמל למתאימים /ות דרושים חבר הון אנושי מפתח /ת SAP ABAP דרושים טאואר סמיקונדקטור דרוש /ה 数据分析总监 דרושים אופיסופט 全栈开发人员 上一页 SQLink מפתח /ת תשתיות דאטה ותומך תשתית BI דרושים המימד השביעי בע"מ מפתח /ת תשתיות דאטה ותומך /ת תשתית BI דרושים יוניטסק לארגון בעל משמעות גבוהה דרוש /ה תוכניתן /ית ABAP דרושים יוניטסק 上一页 דרושים טלדור Taldor מערכות מחשבים דרוש /ה מפתח /ת אינטגרציה 上一页 SQLink דרוש /ה ראש צוות 全栈 מתכנת /ת 高级软件工程师经理 高级软件工程师 高级嵌入式软件工程师 嵌入式软件工程师 高级软件工程师 子公司 PMM 经理 תוכניתן /ית BackEnd 全栈/前端软件工程师 软件验证工程师 首席产品经理 量子算法研究实习生 校长/高级检测组组长 支持工程师 软件工程师

您的问题是要过滤掉希伯来字符吗?因为那只需要简单的正则表达式!导入 re 包,然后用这个替换你的 print 语句:

print(re.sub('[^A-z0-9]+',' ',item.text))

希望这会有所帮助!

【讨论】:

  • 您是否按原样运行 OPs 代码?当我尝试这样做时,我没有得到你所拥有的;只有一个长<script>
  • 查看上面的编辑。我已经在我的帖子中包含了内容。确保选择 view page source 以查看内容中的真实内容。谢谢。
  • @JackFleeting 我在 google colab 中复制/粘贴到 .ipynb 并运行该块,没有编辑,这就是我得到的。它对我来说运行得非常完美。
  • 非常非常奇怪。我在笔记本上运行了完全相同的东西,但在我自己的电脑(Win 10)上运行,并且收到了 @asmitu 在他的乱码文件中的确切内容。我猜这一定是字符编码问题。以前从未见过这个...
  • 如果是编码问题,那么可能会在 BeautifulSoup 之前添加res.encoding = res.apparent_encoding 搞砸?我无法运行它并查看它是否有帮助,因为我没有收到错误(也是 Win 10)。参考:stackoverflow.com/questions/44203397/…
【解决方案2】:

要成功获取预期请求,您必须使用 cookie。对于您需要的 URL,rbzid cookie 就足够了。您可以手动获取它,如果它过期,您可以使用 Selenium 和代理服务器实现解决方案以刷新它并继续使用requests 抓取。

user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) ' \
             'Chrome/80.0.3987.122 Safari/537.36'
cookies = {
    'rbzid': 'DGF6ckG9dPQkJ0RhPIIqCu2toGvky84UY2z7QpJln31JVdw/YU4wJ7WXe5Tom9VhEvsZT6PikTaeZjJfsKwp'
             'M1TaCZr6tOHaOtE8jX3eWsFX5Zm8TJLeO8+O2fFfTHBf++lRgo/NaYq/sXh+QobO59zQRmZQd0XMjTSpVMDu'
             'YZS8C3GMsIR8cBt9gyuDCYD2XL8pVz68fD4OqBep3G/LnKR4bQsMiLHwKjglQ4fBrq8=',
}
headers = {'User-Agent': user_agent, }
params = (
    ('page', '1'),
    ('position', '235'),
    ('type', ''),
    ('city', ''),
    ('region', ''),
)

response = requests.get('https://www.alljobs.co.il/SearchResultsGuest.aspx',
                        headers=headers, params=params, cookies=cookies)

soup = BeautifulSoup(response.text, "lxml")
titles = soup.select("a[title]")

【讨论】:

  • 您的方法指向正确的方向。难道也不能使用请求来获取cookie吗?谢谢。
  • 您收到并分享的响应是一个 Javascript 代码,您可以尝试用它做一些事情。但我最简单的解决方案是使用代理服务器和 Selenium 来捕获所需的标头。只有在需要更新标头时才能使用它
  • @asmitu 要解决与hard-coded cookies 相关的问题,您可以使用 PyChromeDevTools 工具。我已经实现了一种从任何 URL 自动获取 cookie 的方法。访问:stackoverflow.com/questions/59045550/…
猜你喜欢
  • 1970-01-01
  • 2020-05-30
  • 2019-12-06
  • 1970-01-01
  • 2020-06-07
  • 2021-01-31
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多