【问题标题】:Selenium- BS4 : Facing issue in scraping webpageSelenium-BS4:在抓取网页时面临问题
【发布时间】:2020-03-24 20:30:28
【问题描述】:

我想从下面给定的 URL 中抓取所有公司的公司信息并查看他们的工作详细信息 网址:http://desiopt.com/search-results-jobs/

from selenium import webdriver
import bs4
import pandas as pd
from bs4 import BeautifulSoup
import re
driver =  webdriver.Chrome(executable_path=r"C:/Users/Chandra Sekhar/Desktop/chrome-driver/chromedriver.exe")
titles=[]
driver.get("http://desiopt.com/search-results-jobs/")
content = driver.page_source
soup = BeautifulSoup(content)
for a in soup.findAll('div',attrs={'class':'listing-links'}):
    info=a.find('div', attrs={'class':'userInfo'})
    print(info.text)
    titles.append(info.text)
    df = pd.DataFrame({'Company info':titles})
    df['Price'] = df['Price'].map(lambda x: re.sub(r'\W+', '', x))
    df.to_csv('products1.csv', index=False)

【问题讨论】:

  • @ajayai 有什么问题?哪条线??错误堆栈跟踪???
  • @αԋɱҽԃαмєяιcαη 感谢您的关注。我已经以这种格式检查了你的 csv 文件,只有我需要输出文件。我是网络抓取的新手,请与我分享代码以更好地理解它。谢谢@αԋɱҽԃαмєяιcαη
  • 我已经检查了文件。请在答案部分写代码
  • @ajayai 在下面查看我的答案

标签: python selenium-webdriver beautifulsoup


【解决方案1】:

使用以下url

https://desiopt.com/search-results-jobs/?action=search&page=&listings_per_page=&view=list

这是您将编辑的两个参数page=listings_per_page=

目前该网站确实有37091 职位。

经过我的测试,我确实看到listings_per_page 每页受到1000 的限制。

示例:https://desiopt.com/search-results-jobs/?action=search&page=1&listings_per_page=1000&view=list

所以你需要从page=1循环到page=38并设置listings_per_page=1000

这意味着1000 每页结果 * 38 page = 38000

之后

您将收集所有链接并将其传递给list,条件是删除重复项,以防您担心sort。否则只需将其传递给set,它不接受重复但它不关心sort。然后你可以解析listset中的每一个url来收集信息。

顺便说一句,我将遍历371页面,每个页面包含100个项目,所以我会得到37100url(如果最后一页的url少于100,则更少) 并从中删除重复项,然后解析:

import requests
from bs4 import BeautifulSoup
import csv

links = []
try:
    for item in range(1, 372):
        print(f"Extraction Page# {item}")
        r = requests.get(
            f"https://desiopt.com/search-results-jobs/?action=search&page={item}&listings_per_page=100&view=list")
        if r.status_code == 200:
            soup = BeautifulSoup(r.text, 'html.parser')
            for item in soup.findAll('span', attrs={'class': 'captions-field'}):
                for a in item.findAll('a'):
                    a = a.get('href')
                    if a not in links:
                        links.append(a)
except KeyboardInterrupt:
    print("Good Bye!")
    exit()

data = []
try:
    for link in links:
        r = requests.get(link)
        if r.status_code == 200:
            soup = BeautifulSoup(r.text, 'html.parser')
            for item in soup.findAll('div', attrs={'class': 'compProfileInfo'}):
                a = [a.text.strip() for a in item.findAll('span')]
                if a[6] == '':
                    a[6] = 'N/A'
                data.append(a[0:7:2])
except KeyboardInterrupt:
    print("Good Bye!")
    exit()

while True:
    try:
        with open('output.csv', 'w+', newline='') as file:
            writer = csv.writer(file)
            writer.writerow(['Name', 'Phone', 'Email', 'Website'])
            writer.writerows(data)
            print("Operation Completed")
    except PermissionError:
        print("Please Close The File")
        continue
    except KeyboardInterrupt:
        print("Good Bye")
        exit()
    break

结果可以在这里查看: Click Here

输出是 1885 Rows,因为我已经让脚本在解析之前为公司删除重复的 links

在线运行代码:Click Here

【讨论】:

  • @ahmed 美国当我尝试执行代码时出现以下错误。 ConnectionError: HTTPSConnectionPool(host='desiopt.com', port=443): url 超出最大重试次数:/search-results-jobs/?action=search&page=1&listings_per_page=100&view=list(由 NewConnectionError(': 无法建立新连接:[Errno 101] Network is unreachable'))
  • @ajayai 网站更改了设计并要求您先登录,因此您需要创建帐户并发出帖子请求
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 2021-11-02
  • 2019-02-12
  • 2019-09-03
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2020-09-13
相关资源
最近更新 更多