【问题标题】:How to improve this webscraping python script?如何改进这个 webscraping python 脚本?
【发布时间】:2020-04-25 10:23:02
【问题描述】:

简要背景,我两周前开始使用 Python,所以请不要犹豫,纠正您看到的任何错误或改进。我正在尝试从网站 www.fff.fr 的结果俱乐部列表中抓取数据。

我的组织方式是:

  1. 进入首页
  2. 接受 Cookie
  3. 使用城市名称搜索栏
  4. 获取结果列表
  5. 关注结果页面的每个网址
  6. 转到每个“员工”子部分
  7. 从此页面提取数据

我开始构建下面的 python 代码,但到目前为止还没有工作。我真的很想获得有关如何使其真正发挥作用的反馈。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from shutil import which

chrome_path = which("chromedriver")

driver = webdriver.Chrome(executable_path=chrome_path)
driver.get("https://fff.fr")

cookie_btn = driver.find_element_by_id("didomi-notice-agree-button")
cookie_btn.click()

search_input = driver.find_element_by_xpath("/html//form[@id='proximiteSearch']//input[@id='fff_club_form_club_near_to_search_address']")
search_input.send_keys("Paris")
search_input.send_keys(Keys.ENTER)

self.html = driver.page_source
driver.close()

def parse(self, response):
        resp = Selector(text=self.html)
        clubs = resp.xpath("(//ul[contains(@id, 'listresulclub')])/li/text()")
        for club in clubs:
            name = club.xpath(".//text()").get()
            name_link = club.xpath(".//@href").get()

            url = f"https://www.ffr.fr{name_link}"
            absolute_url = url[:-10] + "/le-staff"
            # absolute_url =  response.urljoin()

            yield scrapy.Request(url=absolute_url, meta={'club_name':name})
            #yield response.follow (url = name_link, callback=self.parse_country, meta={'club_name': name})

def parse_country(self, response):
        name = response.request.meta['club_name']
        contacts = response.xpath("//div[@class='coor-block-content']/ol")
        for contact in contacts:
            contact_nom = contact.xpath(".//li[1]/text()").get()
            yield {
                'club_name': name,
                'correspondant_nom': contact_nom
            }

【问题讨论】:

  • 请具体说明什么不工作。以上哪些步骤有效?
  • 我只是给你一些提示。在我看来,硒是要走的路。当自动化某事或尝试提取数据时,您必须考虑如果您手动执行它会做什么。尝试拆分主要功能中的任务,以便您可以一一测试以检查您是否得到想要的东西。这种方式更容易找到您的错误并在以后更新它们。继续努力!
  • 此外,这两个函数都不会在您提供的代码中调用/使用,因此您的部分代码不会被执行。也许尝试在driver.close() 下面做parse(self.html)

标签: python selenium web-scraping scrapy


【解决方案1】:

你可以在没有硒的情况下尝试同样的事情,它可以工作:

import bs4
import requests
import sys
import re 
import unicodedata
import os
import random
import datetime

Current_Date_Formatted = datetime.datetime.today().strftime ('%d-%b-%Y')
time = str(Current_Date_Formatted)

filename = "footballstuff"
cityname = sys.argv[1]

filename=r"D:\Huzefa\Desktop\\" +filename+ ".txt"
url = "https://www.fff.fr/resultats?search="+cityname
res = requests.get(url)
soup = bs4.BeautifulSoup(res.text, "lxml")


file = open(filename , 'wb')
for i in soup.select("a"):
    f=i.text
    file.write(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", f)).encode('ascii', 'ignore'))
    file.write(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", os.linesep)).encode('ascii', 'ignore'))
    file.write(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", os.linesep)).encode('ascii', 'ignore'))
file.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多