我目前正在尝试运行以下代码,但它始终仅抓取每个页面的第一个结果。知道可能是什么问题吗?
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from firstproject.items import xyz123Item
import urlparse
from scrapy.http.request import Request
class MySpider(CrawlSpider):
name = "xyz123"
allowed_domains = ["www.xyz123.com.au"]
start_urls = ["http://www.xyz123.com.au/",]
rules = (Rule (SgmlLinkExtractor(allow=("",),restrict_xpaths=('//*[@id="1234headerPagination_hlNextLink"]',))
, callback="parse_xyz", follow=True),
)
def parse_xyz(self, response):
hxs = HtmlXPathSelector(response)
xyz = hxs.select('//div[@id="1234SearchResults"]//div/h2')
items = []
for xyz in xyz:
item = xyz123Item()
item ["title"] = xyz.select('a/text()').extract()[0]
item ["link"] = xyz.select('a/@href').extract()[0]
items.append(item)
return items
Basespider版本可以很好地在首页上抓取所有必需的数据:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from firstproject.items import xyz123
class MySpider(BaseSpider):
name = "xyz123test"
allowed_domains = ["xyz123.com.au"]
start_urls = ["http://www.xyz123.com.au/"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
titles = hxs.select('//div[@id="1234SearchResults"]//div/h2')
items = []
for titles in titles:
item = xyz123Item()
item ["title"] = titles.select("a/text()").extract()
item ["link"] = titles.select("a/@href").extract()
items.append(item)
return items
对不起,审查。出于隐私原因,我不得不审查该网站。
第一个代码很好地爬行了页面,就像我希望的那样,但是它只提取了第一个项目的标题和链接。注意:在Google中使用“检查元素”的第一个标题的XPath是:
//*[@id="xyz123SearchResults"]/div[1]/h2/a
,第二个是
//*[@id="xyz123SearchResults"]/div[2]/h2/a
第三是
//*[@id="xyz123SearchResults"]/div[3]/h2/a
等。我不确定div [n]位是否正在杀死它。我希望这是一个简单的解决方法。
谢谢
最佳答案
for xyz in xyz:
item = xyz123Item()
item ["title"] = xyz.select('a/text()').extract()[0]
item ["link"] = xyz.select('a/@href').extract()[0]
items.append(item)
return items
您确定退货项目的缩进吗?应该少一。
关于python - 只抓取每个页面的第一个结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20028954/