Я написал скрипт с использованием 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()
Как можноЯ заставляю свой второй сценарий работать, имитируя первый сценарий?