我想询问(抓取)如何(点击抓取)点击下一个按钮(更改网站的号码页面)(然后从this site
进行更多抓取,直到页码末尾)我尝试将刮痧与硒混合,但仍有错误,并说"line 22
self.driver = webdriver.Firefox()
^
IndentationError: expected an indented block"
我不知道为什么会发生这种情况,我认为我的代码非常好。任何人都可以解决这个问题吗?
这是我的来源:
from selenium import webdriver
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from now.items import NowItem
class MySpider(BaseSpider):
name = "nowhere"
allowed_domains = ["n0where.net"]
start_urls = ["https://n0where.net/"]
def parse(self, response):
for article in response.css('.loop-panel'):
item = NowItem()
item['title'] = article.css('.article-title::text').extract_first()
item['link'] = article.css('.loop-panel>a::attr(href)').extract_first()
item['body'] ='' .join(article.css('.excerpt p::text').extract()).strip()
#item['date'] = article.css('[itemprop="datePublished"]::attr(content)').extract_first()
yield item
def __init__(self):
self.driver = webdriver.Firefox()
def parse2(self, response):
self.driver.get(response.url)
while True:
next = self.driver.find_element_by_xpath('/html/body/div[4]/div[3]/div/div/div/div/div[1]/div/div[6]/div/a[8]/span')
try:
next.click()
# get the data and write it to scrapy items
except:
break
self.driver.close()`
答案 0 :(得分:2)
忽略语法和缩进错误,您的代码逻辑通常会出现问题。
您所做的是创建webdriver并且永远不会使用它。你的蜘蛛在这里做的是:
self.start_urls
中的每个网址安排一个请求,在您的情况下,它只是一个。Response
对象并将其传递给self.parse()
你的parse2从未被调用过,所以你的selenium webdriver从未使用过。
由于在这种情况下您没有使用scrapy下载任何内容,您可以覆盖start_requests()
(< - 蜘蛛开始的地方)蜘蛛的方法来完成整个逻辑。
类似的东西:
from selenium import webdriver
import scrapy
from scrapy import Selector
class MySpider(scrapy.Spider):
name = "nowhere"
allowed_domains = ["n0where.net"]
start_url = "https://n0where.net/"
def start_requests(self):
driver = webdriver.Firefox()
driver.get(self.start_url)
while True:
next_url = driver.find_element_by_xpath(
'/html/body/div[4]/div[3]/div/div/div/div/div[1]/div/div[6]/div/a[8]/span')
try:
# parse the body your webdriver has
self.parse(driver.page_source)
# click the button to go to next page
next_url.click()
except:
break
driver.close()
def parse(self, body):
# create Selector from html string
sel = Selector(text=body)
# parse it
for article in sel.css('.loop-panel'):
item = dict()
item['title'] = article.css('.article-title::text').extract_first()
item['link'] = article.css('.loop-panel>a::attr(href)').extract_first()
item['body'] = ''.join(article.css('.excerpt p::text').extract()).strip()
# item['date'] = article.css('[itemprop="datePublished"]::attr(content)').extract_first()
yield item
答案 1 :(得分:1)
这是缩进错误。查看错误附近的行:
Dealer *dealer = [[Dealer alloc] initWithDictionary:object[@"Dealer"]];
这两行中的第一行以冒号结尾。因此,第二行应该比第一行缩进更多。
根据您的要求,有两种可能的修复方法。将缩进级别添加到第二个:
def parse2(self, response):
self.driver.get(response.url)
或移动 def parse2(self, response):
self.driver.get(response.url)
init `函数:
parse2 function out of the