我正在使用scrapy,我想要通过www.rentler.com。我去了网站搜索了我感兴趣的城市,这里是搜索结果的链接:
https://www.rentler.com/search?Location=millcreek&MaxPrice=
现在,我感兴趣的所有列表都包含在该页面上,我希望逐个递归地逐步执行它们。
每个列表都列在:
<body>/<div id="wrap">/<div class="container search-res">/<ul class="search-results"><li class="result">
每个结果都有<a class="search-result-link" href="/listing/288910">
我知道我需要为crawlspider创建一个规则并让它查看该href并将其附加到url。这样它就可以进入每个页面,并获取我感兴趣的数据。
我想我需要这样的事情:
rules = (Rule(SgmlLinkExtractor(allow="not sure what to insert here, but this is where I think I need to href appending", callback='parse_item', follow=true),)
更新 * 感谢您的输入。这是我现在拥有的,它似乎运行但不刮: *
import re
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from KSL.items import KSLitem
class KSL(CrawlSpider):
name = "ksl"
allowed_domains = ["https://www.rentler.com"]
start_urls = ["https://www.rentler.com/ksl/listing/index/?sid=17403849&nid=651&ad=452978"]
regex_pattern = '<a href="listing/(.*?) class="search-result-link">'
def parse_item(self, response):
items = []
hxs = HtmlXPathSelector(response)
sites = re.findall(regex_pattern, "https://www.rentler.com/search?location=millcreek&MaxPrice=")
for site in sites:
item = KSLitem()
item['price'] = site.select('//div[@class="price"]/text()').extract()
item['address'] = site.select('//div[@class="address"]/text()').extract()
item['stats'] = site.select('//ul[@class="basic-stats"]/li/div[@class="count"]/text()').extract()
item['description'] = site.select('//div[@class="description"]/div/p/text()').extract()
items.append(item)
return items
思想?
答案 0 :(得分:5)
如果你需要从html文件中删除数据,我建议使用BeautifulSoup,这很容易安装和使用:
from bs4 import BeautifulSoup
bs = BeautifulSoup(html)
for link in bs.find_all('a'):
if link.has_attr('href'):
print link.attrs['href']
这个小脚本会获得href
HTML标记内的所有a
。
编辑:功能齐全的脚本:
我在计算机上对此进行了测试,结果与预期一致,BeautifulSoup需要纯HTML,您可以从中获取所需内容,请查看此代码:
import requests
from bs4 import BeautifulSoup
html = requests.get(
'https://www.rentler.com/search?Location=millcreek&MaxPrice=').text
bs = BeautifulSoup(html)
possible_links = bs.find_all('a')
for link in possible_links:
if link.has_attr('href'):
print link.attrs['href']
这只会告诉你如何从你想要刮掉的html页面中抓取href,当然你可以在scrapy中使用它,正如我告诉你的那样,BeautifulSoup只需要纯HTML,这就是我使用{{1你可以从中掏出来。所以我猜scrapy可以将那个简单的HTML传递给BeautifulSoup。
编辑2 好吧,看起来我认为你根本不需要scrapy,所以如果前面的脚本为你提供了你想要从作品中获取数据的所有链接,你只需要这样做:
假设我有一个有效的网址列表,我希望从中获取特定数据,比如价格,英亩,地址......您可以只使用之前的脚本而不是打印网址到屏幕,您可以将它们附加到列表并仅附加以requests.get(url).text
开头的那些。这样你就有了一个有效的网址列表。
/listing/
您只需要查看源代码,就可以了解如何从每个网址中获取所需的数据。
答案 1 :(得分:0)
您可以使用正则表达式从链接中查找所有出租家庭ID。从那里,您可以使用您拥有的ID并刮掉该页面。
import re
regex_pattern = '<a href="/listing/(.*?)" class="search-result-link">'
rental_home_ids = re.findall(regex_pattern, SOURCE_OF_THE_RENTLER_PAGE)
for rental_id in rental_home_ids:
#Process the data from the page here.
print rental_id
修改强> 这是一个自己动手编写的代码版本。它打印所有链接ID。你可以按原样使用它。
import re
import urllib
url_to_scrape = "https://www.rentler.com/search?Location=millcreek&MaxPrice="
page_source = urllib.urlopen(url_to_scrape).read()
regex_pattern = '<a href="/listing/(.*?)" class="search-result-link">'
rental_home_ids = re.findall(regex_pattern, page_source)
for rental_id in rental_home_ids:
#Process the data from the page here.
print rental_id