Python爬取数据时,是不是只能每个网站每个网站的分析,有没有通用的方式?

各位爬虫大大们,在爬取数据时,是一个网站一个网站的分析来爬取的,还是说有一种通用的方式来进行? 抓取数据的入口和抓取到的数据是如何保持通用性呢?


Python爬取数据时,是不是只能每个网站每个网站的分析,有没有通用的方式?
17 回复

没有通用的方式,一个一个来

数据通用性的话,先多观察你要爬的网站的数据结构,再根据这个定出你的数据库结构。遇到新网站不兼容时,积极重构代码和数据库


每个网站的结构都不同,所以没有“一招鲜”的通用爬虫。不过,我们可以用一些技巧来减少重复劳动。

核心思路是:把爬虫代码分成“通用流程”和“网站特定规则”两部分。通用流程处理网络请求、队列调度这些脏活;特定规则(比如怎么找下一页链接、怎么提取标题)则单独配置。

给你看个用 requestsparsel 的例子,虽然简单但能说明问题:

import requests
import parsel

class CommonSpider:
    def __init__(self, config):
        self.config = config  # 配置字典,存放特定规则
        
    def crawl(self, start_url):
        html = self.fetch(start_url)
        data = self.parse(html)
        return data
    
    def fetch(self, url):
        # 通用的请求模块,可以在这里加headers、代理等
        resp = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
        resp.encoding = 'utf-8'
        return resp.text
    
    def parse(self, html):
        selector = parsel.Selector(html)
        results = []
        
        # 使用配置中的CSS选择器规则
        for item_sel in selector.css(self.config['item_selector']):
            data = {}
            for field, rule in self.config['field_rules'].items():
                data[field] = item_sel.css(rule).get('').strip()
            results.append(data)
            
        # 找下一页
        next_page = selector.css(self.config['next_page_selector']).get()
        return results, next_page

# 针对某个网站的配置
config_example = {
    'item_selector': '.article-list li',
    'field_rules': {
        'title': 'h2 a::text',
        'link': 'h2 a::attr(href)',
        'summary': '.summary::text'
    },
    'next_page_selector': '.next-page::attr(href)'
}

# 使用
spider = CommonSpider(config_example)
data, next_url = spider.parse(some_html)

更复杂的项目可以用 scrapy,它本身就是按这个理念设计的。你写一个爬虫类,规则通过参数传入,或者把规则存数据库里,爬虫运行时读取。

总结:写个框架配规则,比每个站重写快多了。

如果想要格式化的数据,没什么好的方法。
非格式化的数据那就是搜索引擎的那样的了。


你有没有发现,google 的格式化视图结果居然能够针对各个网站格式化数据,而且做的很好。

google 的格式化视图是什么? google 下没找到是什么呢

做爬虫也好多年了,一般抓取网站中的标题,文章发布时间,正文,文章图片。可以做到 80%用通用规则解决。
1,标题:在提取链接的时候把 link title 保存下来
2,文章发布时间:用网页 heads 里的 last modify
3,抽取正文:有开源的模块( Python 有 readability-lxml,Java 有 JoyHtml
4,文章图片:在抽取的正文中提取<img>

正文抽取

其实有可视化的元素选择器。

要我肯定选( Java 的) jsoup,虽然也要每个站分析,但轻松多了。

那是网站的站长提交了数据格式

感谢,我分析下

你说的可视化的元素选择器是什么?

就算强如 Google Baidu, 也需要别人提交 sitemap 来提升被收录的"体验",
通用正文(or 其他)提取是一个技术难点.

css,xpath 选择器

现在 google 你搜索一些 how to 它会出来一个步骤,我觉得是 goolge 机器判断出来的,不是站长提交的. 这个技术估计 goolge 比较先进,个人爬虫只能 xpath 了

就是页面上点一下你要爬的内容,会自动爬其他网页。

有个 正文抽取咯

可视化抓取可以试一下 portia
https://github.com/scrapinghub/portia

回到顶部