指出下面这段代码存在的问题import scrapy from scrapy import Request,Selector from TaobaoSpider.items import TaobaospiderItem class TaobaoSpider(scrapy.Spider): name = 'taobao' allowed_domains = ['taobao.com'] def start_requests(self): keywords = ['手机', '笔记本电脑', '键鼠套装'] for keyword in keywords: for page in range(2): url = f'https://s.taobao.com/search?q={keyword}&s={48 * page}' yield Request(url=url) # def parse_detail(self, response, **kwargs): # pass def parse(self, response, **kwargs): # 通过selenium帮助我们拿到淘宝页数据,在数据管道中实现 sel = Selector(response) selectors = sel.css('div.items > item.J_MouserOnverReq.item-ad > div.ctx-box.J_MouseEneterLeave.J_IconMoreNew') for selector in selectors: # type: Selector item = TaobaospiderItem() item['title'] = ''.join(selector.css('div.row.row-2.title > a> span::text').extract()).strip() item['price'] = selector.css('div.row.row-1.g-clearfix > div.price.g_price.g_price-highlight > strong::text').extract_first().strip() item['deal_count'] = selector.css('div.row.row-1.g-clearfix > div.deal-cnt::text').extract_first().strip() item['shop'] = selector.css('div.row.row-3.g-clearfix > div.shop > a > span:nth-child(2)::text').extract_first().strip() item['location'] = selector.css('div.row.row-3.g-clearfix > div.location::text').extract_first().strip() yield item
时间: 2024-04-01 20:31:45 浏览: 16
这段代码存在以下问题:
1. 第二行的 import Selector 应该改为 from scrapy.selector import Selector,因为 scrapy 模块中没有 Selector 类,Selector 类是在 scrapy.selector 模块中定义的。同时,import Request 也应该改为 from scrapy import Request。
2. 第三行的 from TaobaoSpider.items import TaobaospiderItem 没有问题,但需要确保 TaobaospiderItem 在当前路径下存在。
3. 在 start_requests 函数中,参数 page 的范围应该是从 0 开始,而不是从 2 开始,否则会漏掉第一页的数据。
4. 在 parse 函数中,selectors 的 CSS 选择器应该是 'div.items > div.J_MouserOnverReq',而不是 'div.items > item.J_MouserOnverReq.item-ad > div.ctx-box.J_MouseEneterLeave.J_IconMoreNew',因为 item 和 ctx-box 这两个类名可能会变化。另外,应该在选择器后面加上 :not(.item-service)',以排除广告。
5. 在 parse 函数中,item['price'] 可能为 None,需要做异常处理。
相关问题
Scrapy报错load_item error: <class 'AttributeError'>, 'TextResponse' object has no attribute 'json', html.py, 138
这个错误是由于你在使用`response.json()`方法,而Scrapy的`TextResponse`对象并没有这个属性。`response.json()`方法是用来解析JSON格式的response对象的,如果你的response是HTML格式的,则会报错。
如果你需要解析HTML页面中的数据,你可以使用Scrapy自带的`Selector`选择器来提取数据。具体操作如下:
1. 在Spider类中引入`Selector`:
```python
from scrapy.selector import Selector
```
2. 使用`Selector`选择器提取数据:
```python
def parse(self, response):
# 提取title标签中的文本
title = response.css('title::text').get()
# 提取所有p标签中的文本
paragraphs = response.css('p::text').getall()
```
这样就可以避免`response.json()`方法报错的问题了。
写一个scrapy和selenium结合爬取的代码爬取淘宝
这里是一个使用Scrapy和Selenium结合爬取淘宝的简单示例代码:
```python
import scrapy
from scrapy.selector import Selector
from selenium import webdriver
from scrapy.http import HtmlResponse
from time import sleep
class TaobaoSpider(scrapy.Spider):
name = 'taobao'
allowed_domains = ['taobao.com']
start_urls = ['https://www.taobao.com/']
def __init__(self, *args, **kwargs):
super(TaobaoSpider, self).__init__(*args, **kwargs)
self.driver = webdriver.Chrome()
def parse(self, response):
self.driver.get(response.url)
sleep(3)
selector = Selector(text=self.driver.page_source)
search_input = selector.css("#q")
search_input.clear()
search_input.send_keys("手机")
btn = self.driver.find_element_by_css_selector('#J_TSearchForm > div.search-button > button')
btn.click()
sleep(3)
while True:
selector = Selector(text=self.driver.page_source)
goods = selector.css('.J_MouserOnverReq')
for good in goods:
title = good.css('.title a::text').extract_first()
price = good.css('.price strong::text').extract_first()
yield {
'title': title,
'price': price
}
next_page = self.driver.find_element_by_css_selector('.J_Ajax.next')
if 'disabled' in next_page.get_attribute('class'):
break
else:
next_page.click()
sleep(3)
self.driver.quit()
```
首先,我们需要在`__init__`方法中初始化Selenium的驱动程序。在`parse`方法中,我们使用Selenium模拟用户在淘宝搜索框中输入"手机",然后点击搜索按钮。接下来,我们使用Scrapy的选择器从页面源代码中提取商品的标题和价格,并将其作为字典返回。最后,我们使用Selenium查找下一页按钮,如果按钮没有被禁用,则点击它并等待页面加载。重复此过程,直到找到所有的商品。
需要注意的是,使用Selenium爬取数据的效率比纯粹使用Scrapy要慢得多。因此,如果可以,最好尝试避免使用Selenium来爬取数据。