Scrapy 是一个快速、高层次的网页抓取和网页解析框架,用于抓取网站并从页面中提取结构化的数据。你可以把它想象成一个流水线,网页内容从一头进去,你想要的数据从另一头出来,还帮你整理得整整齐齐的。
安装Scrapy首先,你得有Python环境,这个就不用多说了吧。然后,用pip来安装Scrapy:
pip install scrapy
安装成功后,你可以在命令行输入 scrapy,看看有啥反应,如果出现一堆帮助信息,那就说明安装成功了!
创建Scrapy项目既然有了工具,咱们就得开始干活了。先创建一个Scrapy项目,这就像是建了个工地,准备开始盖大楼。
scrapy startproject myproject
执行这个命令后,会生成一个名为 myproject 的文件夹,里面包含了Scrapy项目的各种模板文件。
项目结构进入 myproject 文件夹,你会看到这样的目录结构:
myproject/ scrapy.cfg myproject/ __init__.py items.py middlewares.py pipelines.py settings.py spiders/ __init__.py
这里面的文件各有各的用处,比如 items.py 是用来定义你要抓取的数据结构的,spiders 文件夹里放的是你的爬虫脚本。
编写爬虫脚本接下来,咱们来编写爬虫脚本。在 spiders 文件夹里,新建一个Python文件,比如 myspider.py。
定义Item在 items.py 文件中,定义你要抓取的数据结构。比如,你要抓取一个网页的标题和URL:
import scrapyclass MyprojectItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field()
编写Spider在 myspider.py 文件中,编写你的爬虫逻辑。这里以抓取一个示例网站的新闻标题和URL为例:
import scrapyclass MySpider(scrapy.Spider): name = 'myspider' allowed_domains = ['example.com'] start_urls = ['http://example.com/news'] def parse(self, response): for item in response.css('div.news-item'): title = item.css('h2.title::text').get() url = item.css('a::attr(href)').get() yield { 'title': title, 'url': url } # 还可以继续抓取下一页 next_page = response.css('a.next::attr(href)').get() if next_page: yield response.follow(next_page, self.parse)
这段代码里,name 是爬虫的名字,allowed_domains 是允许抓取的域名,start_urls 是起始URL。parse 方法是处理响应的回调函数,里面用CSS选择器来提取数据。
运行爬虫回到项目的根目录,运行爬虫:
scrapy crawl myspider
你会看到控制台输出抓取到的数据。如果你想把数据保存到文件里,可以用 -o 参数:
scrapy crawl myspider -o output.json
这样,抓取到的数据就会保存到 output.json 文件里了。
数据处理抓取到数据后,你可能还想对数据进行一些处理,比如去重、清洗、存储到数据库等。这时候,pipelines.py 就派上用场了。
编写Pipeline在 pipelines.py 文件中,定义一个Pipeline类:
class MyprojectPipeline: def process_item(self, item, spider): # 这里可以对item进行处理 return item
然后在 settings.py 文件中,启用这个Pipeline:
ITEM_PIPELINES = { 'myproject.pipelines.MyprojectPipeline': 300,}
数字 300 是优先级,越小优先级越高。
常见问题和技巧避免被反爬虫很多网站都有反爬虫机制,比如检查请求头、限制访问频率等。你可以通过修改请求头、使用代理、设置延时等方式来绕过这些限制。
class MySpider(scrapy.Spider): # ... def start_requests(self): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} for url in self.start_urls: yield scrapy.Request(url=url, headers=headers)
处理动态内容有些网页的内容是通过JavaScript动态加载的,Scrapy默认是抓取不到这些内容的。这时候,你可以使用Scrapy的 Splash 插件,它是一个JavaScript渲染服务,可以抓取动态内容。
日志和调试Scrapy有丰富的日志系统,你可以通过设置日志级别来查看不同级别的日志信息。在调试时,可以把日志级别设为 DEBUG,这样可以看到更多的详细信息。
scrapy crawl myspider --loglevel=DEBUG
温馨提示• 抓取数据时要遵守网站的 robots.txt 规则,不要抓取敏感数据。
• 小心处理异常,比如网络请求失败、页面结构变化等。
• 使用Scrapy时,尽量了解它的工作原理和各个组件的作用,这样才能更好地使用它。
好了,今天咱们就聊到这里。Scrapy这个爬虫神器,功能强大,用法灵活,值得你深入学习。掌握它,你就能轻松地从网页上抓取数据,为后续的数据分析和处理打下坚实的基础!