标签: scrapy

如何在 Owler 等网站的自动化中保留登录令牌?

我正在尝试为诸如angel.co 之类的各种网站开发一个抓取工具。我一直在为www.owler.com网站设计爬虫,因为当我们尝试访问有关公司的信息时,它需要通过邮件登录。

每次我们登录时,我们都会在电子邮件中获得一个新的登录令牌,该令牌将在一段时间后过期。那么,是否有任何适当的解决方案可以使用带有 Py 绑定的 Selenium 在浏览器会话中保留登录会话?

我只是在寻找处理此类情况的指南。已经尝试使用 Selenium 自动执行此任务,但这不是一种富有成效的方法。

python selenium scrapy web-scraping

1
推荐指数
1
解决办法
1405
查看次数

Scrapy 检测 Xpath 是否不存在

我一直在尝试制作我的第一个爬虫,我已经完成了我需要的东西(获取 1º 商店和 2º 商店的运输信息和价格)但是使用 2 个爬虫而不是 1 个,因为我在这里有一个很大的塞子。

当有超过 1 个商店时,输出结果为:

In [1]: response.xpath('//li[@class="container list-display-box__list__container"]/div/div/div/div/div[@class="shipping"]/p//text()').extract()
Out[1]: 
[u'ENV\xcdO 3,95\u20ac ',
 u'ENV\xcdO GRATIS',
 u'ENV\xcdO GRATIS',
 u'ENV\xcdO 4,95\u20ac ']
Run Code Online (Sandbox Code Playgroud)

为了只获得我正在使用的第二个结果:

In [2]: response.xpath('//li[@class="container list-display-box__list__container"]/div/div/div/div/div[@class="shipping"]/p//text()')[1].extract()
Out[2]: u'ENV\xcdO GRATIS'
Run Code Online (Sandbox Code Playgroud)

但是当没有第二个结果(只有 1 个商店)时,我得到:

IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

即使其他项目有数据,爬虫也会跳过整个页面......

在尝试了几次之后,我决定做一个快速的解决方案来获得结果,2 个爬虫 1 个用于第一家商店,另一个用于第二家,但现在我只想用 1 个履带式清洁。

一些帮助,提示或建议将不胜感激,这是我第一次尝试使用scrapy制作递归爬虫,有点像它。

有代码:

# -*- coding: utf-8 -*-
import scrapy
from Guapalia.items import GuapaliaItem
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class GuapaliaSpider(CrawlSpider):
    name = "guapalia"
    allowed_domains = …
Run Code Online (Sandbox Code Playgroud)

xpath web-crawler scrapy web-scraping python-2.7

1
推荐指数
1
解决办法
2252
查看次数

Scrapy Cloud 蜘蛛请求因 GeneratorExit 而失败

我有一个 Scrapy 多级蜘蛛,它在本地工作,但在每次请求时都在 Cloud 中返回 GeneratorExit。

这是解析方法:

def parse(self, response):
    results = list(response.css(".list-group li a::attr(href)"))
    for c in results:
        meta = {}
        for key in response.meta.keys():
            meta[key] = response.meta[key]
        yield response.follow(c,
                              callback=self.parse_category,
                              meta=meta,
                              errback=self.errback_httpbin)

def parse_category(self, response):
    category_results = list(response.css(
        ".item a.link-unstyled::attr(href)"))
    category = response.css(".active [itemprop='title']")
    for r in category_results:
        meta = {}
        for key in response.meta.keys():
            meta[key] = response.meta[key]
        meta["category"] = category
        yield response.follow(r, callback=self.parse_item,
                              meta=meta,
                              errback=self.errback_httpbin)

def errback_httpbin(self, failure):
    # log all failures
    self.logger.error(repr(failure))
Run Code Online (Sandbox Code Playgroud)

这是回溯:

Traceback (most recent …
Run Code Online (Sandbox Code Playgroud)

python scrapy web-scraping

1
推荐指数
1
解决办法
417
查看次数

如何将 url 动态添加到 start_urls

我试图从亚马逊抓取产品信息,但遇到了问题。当蜘蛛到达页面末尾时它会停止,我想为我的程序添加一种方法来一般搜索页面的下 3 页。我正在尝试编辑 start_urls,但我无法从函数解析内部执行此操作。此外,这没什么大不了的,但程序出于某种原因两次请求相同的信息。提前致谢。

import scrapy
from scrapy import Spider
from scrapy import Request

class ProductSpider(scrapy.Spider):
    product = input("What product are you looking for? Keywords help for specific products: ")
    name = "Product_spider"
    allowed_domains=['www.amazon.ca']
    start_urls = ['https://www.amazon.ca/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords='+product]
    #so that websites will not block access to the spider
    download_delay = 30
    def parse(self, response):
        temp_url_list = []
        for i in range(3,6):
            next_url = response.xpath('//*[@id="pagn"]/span['+str(i)+']/a/@href').extract()
            next_url_final = response.urljoin(str(next_url[0]))
            start_urls.append(str(next_url_final))
        # xpath is similar to an address that is used to find certain …
Run Code Online (Sandbox Code Playgroud)

python scrapy web-scraping

1
推荐指数
1
解决办法
1563
查看次数

Scrapy-splash 不渲染来自某个反应驱动站点的动态内容

我很想知道是否有任何飞溅可以从此页面获取动态工作内容 - https://nreca.csod.com/ux/ats/careersite/4/home?c=nreca#/requisition/182

为了让 splash 接收 URL 片段,您必须使用 SplashRequest。为了让它处理 JS cookie,我不得不使用 lua 脚本。下面是我的环境、脚本和爬虫代码。

该网站似乎分 3 个“步骤”呈现:

  1. 带有脚本标签的基本上是空的 html
  2. 上面的脚本运行并生成站点页眉/页脚并检索另一个脚本
  3. #2 中的脚本运行并结合 JS 设置 cookie 检索动态内容(我想抓取的工作)

如果您对 URL 执行简单的 GET(即在邮递员中),您将只会看到第 1 步的内容。与飞溅我只得到第 2 步的结果(页眉/页脚)。我确实在 response.cookiejar 中看到了 JS cookie

我无法获得要呈现的动态作业内容(第 3 步)。

环境:

scrapy 1.3.3 scrapy-splash 0.72 设置

    script = """
        function main(splash)
          splash:init_cookies(splash.args.cookies)
          assert(splash:go{
            splash.args.url,
            headers=splash.args.headers,
            http_method=splash.args.http_method,
            body=splash.args.body,
            })
          assert(splash:wait(15))

          local entries = splash:history()
          local last_response = entries[#entries].response
          return {
            url = splash:url(),
            headers = last_response.headers,
            http_status = last_response.status, …
Run Code Online (Sandbox Code Playgroud)

python screen-scraping splash-screen scrapy reactjs

1
推荐指数
1
解决办法
2205
查看次数

Scrapy 显示 notImplementedError,我不知道为什么

我的 Scrapy 代码不起作用,我不知道为什么。我的蜘蛛是在 Reddit 上爬取权力的游戏 subreddit 的测试。

这是我的代码:

import scrapy


class Redditbot2Spider(scrapy.Spider):
    name = 'redditbot2'
    allowed_domains = ['www.reddit.com']
    start_urls = ['https://www.reddit.com/r/gameofthrones/']


def parse(self, response):
    titles = response.selector.xpath('//h2/text()').extract()
    votes = response.selector.xpath('//div[@class="_1rZYMD_4xY3gRcSS3p80D0"]/test()').extract()
    time = response.selector.xpath('//a[@class="_3jOxDPIQ0KaOWpzvSQo-1s"]/text()').extract()
    comments = response.selector.xpath('//span[@class="FHCV02u6Cp2zYL0fhQPsO"])/text()').extract()

    for item in zip(titles, votes, time, comments):
        scraped_info = {
            'title': titles[0],
            'vote': votes[1],
            'time': time[2],
            'comments': comments[3],
        }
        yield scraped_info
Run Code Online (Sandbox Code Playgroud)

这是错误的日志:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/Library/Python/2.7/site-packages/scrapy/spiders/__init__.py", line 90, in parse …
Run Code Online (Sandbox Code Playgroud)

python scrapy

1
推荐指数
1
解决办法
556
查看次数

Scrapy 管道 SQLAlchemy 在进入数据库之前检查项目是否存在?

我正在编写一个爬虫爬虫来抓取 youtube 视频并捕获、名称、订阅者计数、链接等。我从教程中复制了这个 SQLalchemy 代码并让它工作,但是每次我运行爬虫时,我都会在数据库中得到重复的信息。

我如何检查抓取的数据是否已经在数据库中,如果是,请不要进入数据库....

这是我的 pipeline.py 代码

from sqlalchemy.orm import sessionmaker
from models import Channels, db_connect, create_channel_table

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


class YtscraperPipeline(object):

    """YTscraper  pipeline for storing scraped items in the database"""
    def __init__(self):

                #Initializes database connection and sessionmaker.
                #Creates deals table.
            engine = db_connect()
            create_channel_table(engine)
            self.Session = sessionmaker(bind=engine)

    def process_item(self, item, spider):
                """Save youtube channel …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy scrapy scrapy-pipeline

1
推荐指数
1
解决办法
2322
查看次数

Scrapy FormRequest 无法将复杂的字典作为 formdata 处理

我正在尝试向 scrapy.FormRequest 对象提供表单数据。formdata 是以下结构的字典:

{
  "param1": [
    {
      "paramA": "valueA",
      "paramB": "valueB"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

通过相当于以下代码,在scrapy shell中运行:

from scrapy import FormRequest

url = 'www.example.com'
method_post = 'POST'
formdata = <the above dict>

fr = FormRequest(url=url, method=method_post, formdata=formdata)

fetch(fr)
Run Code Online (Sandbox Code Playgroud)

作为回应,我收到以下错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/chhk/.local/share/virtualenvs/project/lib/python3.6/site-packages/scrapy/http/request/form.py", line 31, in __init__
    querystr = _urlencode(items, self.encoding)
  File "/Users/chhk/.local/share/virtualenvs/project/lib/python3.6/site-packages/scrapy/http/request/form.py", line 66, in _urlencode
    for k, vs in seq
  File "/Users/chhk/.local/share/virtualenvs/project/lib/python3.6/site-packages/scrapy/http/request/form.py", line 67, in <listcomp>
    for v in …
Run Code Online (Sandbox Code Playgroud)

python form-data scrapy web-scraping scrapy-shell

1
推荐指数
1
解决办法
382
查看次数

如何加速scrapy

我需要收集很多(真的很多)数据进行统计,所有必要的信息都在里面<script type="application/ld+json"></script> ,我在它下面写了scrapy解析器(html中的脚本),但是解析很慢(大约每秒3页)。有什么办法可以加快这个过程吗?理想情况下,我希望每秒看到 10 多页

#spider.py:

import scrapy
import json

class Spider(scrapy.Spider):
    name = 'scrape'
    start_urls = [
                 about 10000 urls
                 ]

    def parse(self, response):
        data = json.loads(response.css('script[type="application/ld+json"]::text').extract_first())
        name = data['name']
        image = data['image']
        path = response.css('span[itemprop="name"]::text').extract()
        yield {
            'name': name,
            'image': image,
            'path': path
        }
        return
Run Code Online (Sandbox Code Playgroud)

#settings.py:

USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0"
ROBOTSTXT_OBEY = False

CONCURRENT_REQUESTS = 32

DOWNLOAD_DELAY = 0.33
DEFAULT_REQUEST_HEADERS = {
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
}
EXTENSIONS = {
  'scrapy.extensions.telnet.TelnetConsole': …
Run Code Online (Sandbox Code Playgroud)

scrapy

1
推荐指数
1
解决办法
1748
查看次数

将数据存储到 SQL 无法与我的 sql 连接器和 scrapy 一起使用

我试图用scrapy将我抓取的数据存储到SQL数据库中,但我的代码在运行时没有提到任何错误,但没有发送任何内容。

我正在使用我的 sql 连接器,因为我无法安装 MySQL-python。我的 SQL 数据库似乎运行良好,当我运行代码时,流量 KB/s 增加。请在我的 pipelines.py 代码下方找到。

import mysql.connector
from mysql.connector import errorcode

class CleaningPipeline(object):
    ...

class DatabasePipeline(object):

    def _init_(self):
        self.create_connection()
        self.create_table()

    def create_connection(self):
        self.conn = mysql.connector.connect(
            host = 'localhost',
            user = 'root',
            passwd = '********',
            database = 'lecturesinparis_db'
        )
        self.curr = self.conn.cursor()

    def create_table(self):
        self.curr.execute("""DROP TABLE IF EXISTS mdl""")
        self.curr.execute("""create table mdl(
                        title text,
                        location text,
                        startdatetime text,
                        lenght text,
                        description text,
                        )""")

    def process_item(self, item, spider):
        self.store_db(item)
        return item

    def store_db(self, item):
        self.curr.execute("""insert into …
Run Code Online (Sandbox Code Playgroud)

python sql mysql-python scrapy

1
推荐指数
1
解决办法
58
查看次数