我有大约10个奇怪的网站,我希望从这些网站中刮取。其中有几个是wordpress博客,他们遵循相同的html结构,尽管有不同的类。其他的则是论坛或其他格式的博客。
我喜欢的信息是常见的--帖子内容、时间戳、作者、标题和评论。
我的问题是,我必须为每个域创建一个单独的蜘蛛吗?如果不需要,我怎样才能创建一个通用的蜘蛛,让我通过从配置文件或类似的东西加载选项来进行搜刮?
我想我可以从一个文件中加载xpath表达式,这个文件的位置可以通过命令行加载,但似乎有一些困难,当一些域的scraping要求我使用regex select(expression_here).re(regex)
而有些则没有。
在scrapy spider将allow_domains设置为一个域名列表,例如 。
class YourSpider(CrawlSpider):
allowed_domains = [ 'domain1.com','domain2.com' ]
希望能帮到你
好吧,我面临同样的问题,所以我使用动态创建spider类。type()
,
from scrapy.contrib.spiders import CrawlSpider
import urlparse
class GenericSpider(CrawlSpider):
"""a generic spider, uses type() to make new spider classes for each domain"""
name = 'generic'
allowed_domains = []
start_urls = []
@classmethod
def create(cls, link):
domain = urlparse.urlparse(link).netloc.lower()
# generate a class name such that domain www.google.com results in class name GoogleComGenericSpider
class_name = (domain if not domain.startswith('www.') else domain[4:]).title().replace('.', '') + cls.__name__
return type(class_name, (cls,), {
'allowed_domains': [domain],
'start_urls': [link],
'name': domain
})
所以说,要为''创建一个蜘蛛。http:/www.google.com'我就做--
In [3]: google_spider = GenericSpider.create('http://www.google.com')
In [4]: google_spider
Out[4]: __main__.GoogleComGenericSpider
In [5]: google_spider.name
Out[5]: 'www.google.com'
希望能帮到你
我使用下面的XPath表达式做了类似的事情。
'/html/head/title/text()'
对于标题//p[string-length(text()) > 150]/text()
的帖子内容。您可以使用一个空的 allowed_domains
属性来指示scrapy不要过滤任何站外请求。但在这种情况下,你必须小心,只返回来自你的spider的相关请求。
你应该使用BeautifulSoup,尤其是当你使用Python的时候。它可以让你在页面中找到元素,并使用正则表达式提取文本。
你可以使用start_request方法!
然后你也可以对每个url进行优先级排序!然后在上面你可以传递一些元数据。
这是一个工作的示例代码。
"""
For allowed_domains:
Let’s say your target url is https://www.example.com/1.html,
then add 'example.com' to the list.
"""
class crawler(CrawlSpider):
name = "crawler_name"
allowed_domains, urls_to_scrape = parse_urls()
rules = [
Rule(LinkExtractor(
allow=['.*']),
callback='parse_item',
follow=True)
]
def start_requests(self):
for i,url in enumerate(self.urls_to_scrape):
yield scrapy.Request(url=url.strip(),callback=self.parse_item, priority=i+1, meta={"pass_anydata_hare":1})
def parse_item(self, response):
response = response.css('logic')
yield {'link':str(response.url),'extracted data':[],"meta_data":'data you passed' }
我建议你在scrapy上阅读这个页面以获得更多信息。
https:/docs.scrapy.orgenlatesttopicsspiders.html#scrapy.spider.Spider.start_requests。
希望能帮到你:)