我正在尝试为诸如angel.co 之类的各种网站开发一个抓取工具。我一直在为www.owler.com网站设计爬虫,因为当我们尝试访问有关公司的信息时,它需要通过邮件登录。
每次我们登录时,我们都会在电子邮件中获得一个新的登录令牌,该令牌将在一段时间后过期。那么,是否有任何适当的解决方案可以使用带有 Py 绑定的 Selenium 在浏览器会话中保留登录会话?
我只是在寻找处理此类情况的指南。已经尝试使用 Selenium 自动执行此任务,但这不是一种富有成效的方法。
我一直在尝试制作我的第一个爬虫,我已经完成了我需要的东西(获取 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) 我有一个 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) 我试图从亚马逊抓取产品信息,但遇到了问题。当蜘蛛到达页面末尾时它会停止,我想为我的程序添加一种方法来一般搜索页面的下 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) 我很想知道是否有任何飞溅可以从此页面获取动态工作内容 - https://nreca.csod.com/ux/ats/careersite/4/home?c=nreca#/requisition/182
为了让 splash 接收 URL 片段,您必须使用 SplashRequest。为了让它处理 JS cookie,我不得不使用 lua 脚本。下面是我的环境、脚本和爬虫代码。
该网站似乎分 3 个“步骤”呈现:
如果您对 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) 我的 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) 我正在编写一个爬虫爬虫来抓取 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) 我正在尝试向 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) 我需要收集很多(真的很多)数据进行统计,所有必要的信息都在里面<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将我抓取的数据存储到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) scrapy ×10
python ×8
web-scraping ×5
form-data ×1
mysql-python ×1
python-2.7 ×1
reactjs ×1
scrapy-shell ×1
selenium ×1
sql ×1
sqlalchemy ×1
web-crawler ×1
xpath ×1