Python 使用scrapy单击网站上的按钮
我想问一下,如何(做爬网)点击下一步按钮(更改网站的页码)(然后做更多的爬网,直到页码结束)从 我尝试将scrape与selenium结合起来,但仍然存在错误,并说第22行是“代码” self.driver=webdriver.Firefox() ^ 缩进错误:应为缩进块“ 我不知道为什么会这样,我想我的代码很好。任何人都可以解决这个问题吗 这是我的来源:Python 使用scrapy单击网站上的按钮,python,selenium,scrapy,web-crawler,Python,Selenium,Scrapy,Web Crawler,我想问一下,如何(做爬网)点击下一步按钮(更改网站的页码)(然后做更多的爬网,直到页码结束)从 我尝试将scrape与selenium结合起来,但仍然存在错误,并说第22行是“代码” self.driver=webdriver.Firefox() ^ 缩进错误:应为缩进块“ 我不知道为什么会这样,我想我的代码很好。任何人都可以解决这个问题吗 这是我的来源: from selenium import webdriver from scrapy.spider import BaseSpider fr
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()`
这是我对项目伙伴的捕捉:
这是一个缩进错误。查看错误附近的行:
def parse2(self, response):
self.driver.get(response.url)
这两行中的第一行以冒号结尾。因此,第二行应该比第一行缩进更多
有两种可能的修复方法,具体取决于您要执行的操作。向第二个缩进级别添加缩进级别:
def parse2(self, response):
self.driver.get(response.url)
或者将parse2函数移出
init`函数:
def parse2(self, response):
self.driver.get(response.url)
def __init__(self):
self.driver = webdriver.Firefox()
# etc.
忽略语法和缩进错误,您的代码逻辑通常会出现问题 您要做的是创建webdriver,而不要使用它。你的蜘蛛在这里做的是:
self.start\u url
中的每个url安排一个请求,在您的情况下,它只是一个Response
对象并将其传递给self.parse()
在这种情况下,由于您没有使用scrapy下载任何内容,因此您可以覆盖
start\u requests()
(您的代码缩进不足,第5行之后的所有内容都必须缩进4个空格,因为该代码属于您的类。啊,python有关于它的规则吗?————————————我不知道,在此之前我使用java或c进行编码,而这两种语言都没有类似的规则,看起来有很大不同……顺便说一句,我的所有代码似乎都可以,可以是r吗unning..但是在我添加了第19行和更多行之后,它出现了错误,我不知道为什么mate(在mozilla驱动程序之后)…是的,python中的缩进很重要,这就是定义作用域的方式,因为没有大括号等。老实说,你应该用任何编程语言进行适当的嵌入,不管有没有大括号…伙计们,我的代码…自动添加4个空格似乎没问题,但我不知道为什么当我复制粘贴到这里时,它会自动变为左对齐nt-u-顺便问一句,你对我面临的问题有什么解决方案吗?在pict上,我重新发布了我的源代码pict mate。在我像你一样重写那行代码后,它看起来还不错,但是为什么突然没有做爬行并强制关闭我的mozilla firefox,有解决方案吗?@beboy你的网络驱动程序关闭了,因为它实际上没有被使用,请帮我检查我的答案信息为什么会发生这种情况。谢谢伙计,我明天会试试,现在我已经准备好了演示文稿的i要素,我是使用python的新手,它与java或c#如此不同……因此python编程中数字的定位,列出代码对逻辑编码的影响……嘿,伙计,它成功了,主要问题是firefox v47它不兼容使用我的selenium版本,所以我确实降级了firefox,顺便问一下,你知道为什么会发生这个错误吗“TypeError:'NoneType'对象不可编辑”mate是什么意思?如果是这样的话,我想在页面的最后一页做报废处理…关于错误,这意味着它在那里说的是什么。你的代码试图通过一个None
值进行迭代。我猜对于sel.css('.loop panel')中的文章,应该是这个位)
您需要检查是否有一些文章,如果没有,则中断流程,即如果没有sel.css('.loop panel'):return
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