【问题标题】:scrapy Crawl spider Multiple queriesscrapy Crawl spider 多个查询
【发布时间】:2022-10-24 08:31:53
【问题描述】:

我正在尝试查找电子邮件 ID,我有一个列表,我想一个接一个地传递多个搜索查询,但是当我尝试在显示我和缩进错误中使用列表时,谁能帮我解决这个问题?

我的代码在这里:

import scrapy
from scrapy.spiders import CrawlSpider, Request
from googlesearch import search
import re
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import openpyxl

wb = openpyxl.load_workbook("")
sh = wb.active()

class email_extractor(CrawlSpider):
    
    name = 'email_ex'

    def __init__(self,query, *args, **kwargs):
        super(email_extractor, self).__init__(*args, **kwargs)
        self.email_list = []
        self.query = query

    # sending requests

    def start_requests(self):
         
        for results in search(self.query, num=10, stop=None, pause=2):
            yield SeleniumRequest(
                url=results,
                callback=self.parse,
                wait_until=EC.presence_of_element_located(
                    (By.TAG_NAME, "html")),
                dont_filter=True
            )

    # extracting emails
    def parse(self, response):
        EMAIL_REGEX = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
        emails = re.finditer(EMAIL_REGEX, str(response.text))
        for email in emails:
            self.email_list.append(email.group())

        for email in set(self.email_list):
            yield{
                "emails": email
            }

        self.email_list.clear()

我想在 search_query=['info' 'contact' , 'sales','marketing','market places'] 中传递包含多个域的列表 谁能帮我找到解决方案?

【问题讨论】:

  • 请发布您收到的完整回溯和错误消息
  • 不是错误代码工作正常我只是想知道如何使用 for 循环一次搜索查询列表?可以将此代码修改为类似的内容吗?
  • 它已经这样做了... start_requests 方法中的 for 循环返回一个序列,for 循环遍历序列中的每个项目。
  • 不,我在请求中的 for 循环是查找一个查询的 url 并将 selenium req 传递给它们,但是当构造函数被实例化时会调用搜索查询。
  • 我不明白你在问什么...请尝试澄清

标签: python selenium web-scraping scrapy google-search


【解决方案1】:

仍然不能 100% 确定我是否理解该问题,但这里有一个示例,说明如何处理查询列表而不是仅处理一个查询。

    def __init__(self,query, *args, **kwargs):
        super(email_extractor, self).__init__(*args, **kwargs)
        self.email_list = []
        self.queries = [query1,query2,query3,query4]  # list of queries

    # sending requests

    def start_requests(self):
        for query in self.queries:  # iterate through queries
            for results in search(query, num=10, stop=None, pause=2):
                yield SeleniumRequest(
                    url=results,
                    callback=self.parse,
                    wait_until=EC.presence_of_element_located(
                        (By.TAG_NAME, "html")),
                    dont_filter=True
                )

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2015-02-14
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多