Проблема изменения формы Python - PullRequest
0 голосов
/ 16 ноября 2018

Я действительно использую скребок.

https://github.com/PHMark/Web-Scraping

Я изменил его в соответствии со своими потребностями, следующий код:

from bs4 import BeautifulSoup as bs
from selenium import webdriver
import urllib.request, urllib.error, urllib.parse
import re
import ssl
import pandas as pd
import numpy as np
import os

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
#chrome_options = webdriver.ChromeOptions()
#chrome_options.add_argument('--no-sandbox')
prefs = {'download.default_directory' : os.getcwd()}
chrome_options.add_experimental_option('prefs', prefs)

class SoupMaker():
    """
    A class that scrapes indeed's Job ads
    """
    def __init__(self, _url, _driver):
        self.base_url = "https://www.indeed.com"
        self.home_url = self.base_url + _url
        self.job_links = []
        self.driver = _driver
        self.job_datas = []
        self.job_table = []

    def read_page(self):        
        self.ctx = ssl.create_default_context()
        self.ctx.check_hostname = False
        self.ctx.verify_mode = ssl.CERT_NONE
        print("Parsing: ", self.home_url)
        self.url = urllib.request.urlopen(self.home_url,
                              context = self.ctx).read()
        _soup1 = bs(self.url, "html.parser")
        self.a_tags = _soup1('a')

    def get_job_url(self):
        for link in self.a_tags:
            link = link.get("href", None)
            if link != None:
                cmp_url = re.search("^/.+/.+/jobs/.+", link)
                rc_url = re.search("^/rc.+", link)
                if cmp_url or rc_url:
                    self.job_links.append(self.base_url + link.strip())

    def get_job_info(self):
        for link in self.job_links:
            print("    Scraping: ", link)
            self.driver.get(link)
            self.driver.implicitly_wait(2750)
            _soup2 = bs(self.driver.page_source, "lxml")
            self.title = _soup2.find("title").get_text()
            self.job_descs = _soup2.find_all('div', 'jobsearch-JobComponent-description icl-u-xs-mt--md')
            self.job_origins = _soup2.find_all('div', 'jobsearch-JobMetadataFooter')

            self.job_title = re.findall("(.+) - .+ - .+", self.title)[0]
            self.job_location = re.findall(".+ - (.+) - .+", self.title)[0]
            self.description = ''
            for d in self.job_descs:
                self.description += d.get_text("|", strip = True) 
            self.origin = re.findall("^.+ ago", self.job_origins[0].get_text())[0]    
            self.job_datas.append(self.job_title)
            self.job_datas.append(self.job_location)
            self.job_datas.append(self.description)
            self.job_datas.append(self.origin)

        self.x = np.array(self.job_datas).reshape((10,4))
        df = pd.DataFrame(data=self.x, columns=['Job Title', 'Job Location',
                                    'Job Description', 'Job Origin'])
        return df

if __name__ == '__main__':
    n = int(input("Enter no. of pages to scrape: "))
    n = n*10
    file_name = input("Enter CSV filename: ")
    #    driver = webdriver.Chrome(r"C:\chromedriver\chromedriver.exe")
    #driver = webdriver.Chrome('/usr/local/bin/chromedrive') 
    driver = webdriver.Chrome('/usr/local/bin/chromedriver',chrome_options=chrome_options)  
    chrome_options=chrome_options
    writer = pd.ExcelWriter('{0}.xlsx'.format(file_name), engine='xlsxwriter')
    df = []

    for i in range(10, n+10, 10):
        #ext = "/jobs?q=&l=United+States&start={0}".format(i-10)
        ext = "/jobs?l=United+States&start={0}".format(i-10)
        if n == 10:
            #ext = "/jobs-in-United+States"
            ext ="/l-United+States-jobs.html"
        s = SoupMaker(ext, driver)
        s.read_page()
        s.get_job_url()
        df.append(s.get_job_info())

    result = pd.concat(df)
    result.to_excel(writer, index=False)
    writer.save()
    driver.close()

Скрипт работает отличноЕсли я пытаюсь удалить только 1 страницу, но если я пытаюсь очистить более 10 страниц, выдается следующая ошибка:

Traceback (последний вызов был последним): файл "file.py", строка 96, в (модуль) df.append (s.get_job_info ()) Файл "file.py", строка 71, в get_job_info self.x = np.array (self.job_datas) .reshape ((10,4)) ValueError:не может преобразовать массив размера 0 в форму (10,4)

Если вход для страниц больше 100 или 50, это выдаст следующую ошибку:

Трассировка (последний вызов был последним): файл "file.py", строка 100, в df.append (s.get_job_info ()) Файл "file.py", строка 64, в get_job_info self.job_title = re.findall ("(. +) -. + -. + ", self.title) [0] IndexError: список индексов вне диапазона

Буду очень признателен, если кто-нибудь сможет мне помочь с этим!Заранее спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

Просто глядя на это, я думаю, проблема в том, что он фактически не получает никаких данных.Если никакие ссылки не анализируются в методе get_job_url, цикл в get_job_info не будет работать, и массив будет иметь нулевой размер.Это приведет к сбою изменения формы.

Чтобы лучше понять, что происходит, попробуйте либо использовать отладчик для проверки состояния, либо просто использовать распечатки, чтобы лучше понять, что происходит.Может быть так, что URL на 10 страниц плохой и дает 404 страницы, на которых нет ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...