【问题标题】:Specifying the number of pages in indeed URL确实不能刮超过 2 页
【发布时间】:2022-06-28 23:34:35
【问题描述】:

我正在使用 Python 进行一些网络抓取,以在确实职位发布的职位描述中找到某些关键字。

但是我只能浏览 2 页。如果我将页数增加到 3(变量 nopa),则会出现错误:'NoneType' object has no attribute 'find'。 如果有人知道为什么会这样,那将非常有帮助。

这是我的代码:

import re
from bs4 import BeautifulSoup
import requests
import matplotlib.pyplot as plt
import pandas as pd

keywordlist = []
keywords = ["PYTHON", "JAVA", "SQL", "NOSQL", "MONGODB", "CASSANDRA",
            "AWS", "AZURE", "SPARK", "AIRFLOW", "HIVE", "HADOOP", "REDSHIFT",
            "S3", "KAFKA", "TABLEAU", "EXCEL", "QLIK", "POWER BI",
            "DYNAMODB", "WAREHOUS", "ALTERYX", "LAKE", "ETL", "CI/CD", "BASH",
            "SHELL"]

occurences = []
tags = []
nopa = 2

for i in range(nopa):

    url = "https://de.indeed.com/jobs?q=data%" + str(nopa*10) + "engineer&l&vjk=144c9cb8990a7fc2"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'lxml')

    outer_most_point=soup.find('div',attrs={'id': 'mosaic-provider-jobcards'})
    for job in outer_most_point.find('ul'):
        point = job.find("a")
        if point is not None:
            tags.append(point["href"])

for i in range(len(tags)):
    url_href='https://de.indeed.com' + tags[i]
    response = requests.get(url_href)
    soup2 = BeautifulSoup(response.text, 'html.parser')

    for i in soup2.find('div',{'class':'jobsearch-jobDescriptionText'}):
        keywordsublist = []             
        for keyword in keywords:
            if keyword in str(i).upper():
                keywordsublist.append(keyword) 
        keywordsublist = list(set(keywordsublist)) 
        keywordlist = keywordlist + keywordsublist

for keyword in keywords:
    if keyword in keywordlist:
        occurences.insert(keywords.index(keyword),keywordlist.count(keyword))
    else: occurences.insert(keywords.index(keyword),0)

df = pd.DataFrame( list(zip(keywords, occurences)), columns =['Technology', 'num'])
df = df[df.num != 0]
df = df.sort_values('num')

plt.bar('Technology', 'num', data=df, color='blue')
plt.show()

【问题讨论】:

  • 你能告诉我们response 在第三页的样子吗?
  • 这是什么 - "https://de.indeed.com/jobs?q=data%" + str(nopa*10) + "engineer&l&vjk=144c9cb8990a7fc2" ?你重新找到“数据工程师”,链接中的空格 - %20。所以对于第一页 - https://de.indeed.com/jobs?q=Data%20Engineer&start=0,第二页 - https://de.indeed.com/jobs?q=Data%20Engineer&start=10,第三页 - https://de.indeed.com/jobs?q=Data%20Engineer&start=20,等等
  • 响应代码始终为 200(正常)。使用 Sergeys 解决方案,它现在可以工作了。我认为 20 表示第二页有 10 个列表,30 表示第三页,依此类推。非常感谢您的两个回答。

标签: python web-scraping beautifulsoup request


【解决方案1】:

您可以更新 url 的最后一个子字符串,因为它遵循一个模式:

url = https://de.indeed.com/jobs?q=Data%20Engineer&start=0 -> 第一页

url = https://de.indeed.com/jobs?q=Data%20Engineer&start=10 -> 第二页

url = https://de.indeed.com/jobs?q=Data%20Engineer&start=20 -> 第三页 ... 以此类推

或者,在每个页面中,您可以在位于分页列表类名中的 Href 属性中获取下一页的链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多