Не могу разобрать какой-то контент, используя настроенный метод - PullRequest
0 голосов
/ 09 марта 2019

Я написал скрипт с использованием scrapy для получения номера name, phone и email с веб-сайта.Содержимое, которое я ищу, доступно в двух разных ссылках, например, name и phone в одной ссылке, а email - в другой.Я использовал yellowpages.com в качестве примера и попытался реализовать логику таким образом, чтобы я мог проанализировать email, даже когда я на его целевой странице.Это требование, которое я не могу использовать meta .Тем не менее, я использовал requests и BeautifulSoup в сочетании с копией для выполнения работы, выполняющей вышеуказанное условие, но это очень медленно.

Рабочий (вместе с requests и BeautifulSoup):

import scrapy
import requests
from bs4 import BeautifulSoup
from scrapy.crawler import CrawlerProcess

def get_email(target_link):
    res = requests.get(target_link)
    soup = BeautifulSoup(res.text,"lxml")
    email = soup.select_one("a.email-business[href^='mailto:']")
    if email:
        return email.get("href")
    else:
        return None

class YellowpagesSpider(scrapy.Spider):
    name = "yellowpages"
    start_urls = ["https://www.yellowpages.com/search?search_terms=Coffee+Shops&geo_location_terms=San+Francisco%2C+CA"]

    def parse(self,response):
        for items in response.css("div.v-card .info"):
            name = items.css("a.business-name > span::text").get()
            phone = items.css("div.phones::text").get()
            email = get_email(response.urljoin(items.css("a.business-name::attr(href)").get()))
            yield {"Name":name,"Phone":phone,"Email":email}

if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0',
    })
    c.crawl(YellowpagesSpider)
    c.start()

Я пытаюсь имитировать вышеуказанную концепцию без requests и BeautifulSoup, но не могу заставить ее работать.

import scrapy
from scrapy.crawler import CrawlerProcess

class YellowpagesSpider(scrapy.Spider):
    name = "yellowpages"
    start_urls = ["https://www.yellowpages.com/search?search_terms=Coffee+Shops&geo_location_terms=San+Francisco%2C+CA"]

    def parse(self,response):
        for items in response.css("div.v-card .info"):
            name = items.css("a.business-name > span::text").get()
            phone = items.css("div.phones::text").get()
            email_link = response.urljoin(items.css("a.business-name::attr(href)").get())

            #CANT APPLY THE LOGIC IN THE FOLLOWING LINE

            email = self.get_email(email_link)
            yield {"Name":name,"Phone":phone,"Email":email}

    def get_email(self,link):
        email = response.css("a.email-business[href^='mailto:']::attr(href)").get()
        return email

if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0',
    })
    c.crawl(YellowpagesSpider)
    c.start()

Как можноЯ заставляю свой второй сценарий работать, имитируя первый сценарий?

1 Ответ

1 голос
/ 10 марта 2019

Я бы использовал response.meta, но если потребуется, чтобы избежать этого, хорошо, давайте попробуем по-другому: проверьте lib https://pypi.org/project/scrapy-inline-requests/

from inline_requests import inline_requests


class YellowpagesSpider(scrapy.Spider):
    name = "yellowpages"
    start_urls = ["https://www.yellowpages.com/search?search_terms=Coffee+Shops&geo_location_terms=San+Francisco%2C+CA"]

    @inline_requests
    def parse(self, response):
        for items in response.css("div.v-card .info"):
            name = items.css("a.business-name > span::text").get()
            phone = items.css("div.phones::text").get()

            email_url = items.css("a.business-name::attr(href)").get()
            email_resp = yield scrapy.Request(response.urljoin(email_url), meta={'handle_httpstatus_all': True})
            email = email_resp.css("a.email-business[href^='mailto:']::attr(href)").get() if email_resp.status == 200 else None
            yield {"Name": name, "Phone": phone, "Email": email}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...