php 爬虫抓取网页数据( 如下几个步骤:Scrapy使用Python语言编写,请先去学习下基本知识 )
优采云 发布时间: 2022-01-22 06:03php 爬虫抓取网页数据(
如下几个步骤:Scrapy使用Python语言编写,请先去学习下基本知识
)
爬虫:Scrapy Notes - 完整示例
在本篇文章中,我们将通过一个比较完整的例子来教大家如何使用Scrapy。我选择爬虎秀网首页的新闻列表。
在这里,我们将完成以下步骤:
Scrapy 是用 Python 语言编写的,如果您不熟悉该语言,请先学习基础知识。
创建一个 Scrapy 项目
在您喜欢的任何目录中执行以下命令
scrapy startproject coolscrapy
将使用以下目录结构创建coolscrapy 文件夹:
coolscrapy/
scrapy.cfg # 部署配置文件
coolscrapy/ # Python模块,你所有的代码都放这里面
__init__.py
items.py # Item定义文件
pipelines.py # pipelines定义文件
settings.py # 配置文件
spiders/ # 所有爬虫spider都放这个文件夹下面
__init__.py
...
定义我们的项目
通过创建一个scrapy.Item类并定义它的scrapy.Field类型的属性,我们就可以爬取虎秀网新闻列表的名称、链接地址和摘要了。
import scrapy
class HuxiuItem(scrapy.Item):
title = scrapy.Field() # 标题
link = scrapy.Field() # 链接
desc = scrapy.Field() # 简述
posttime = scrapy.Field() # 发布时间
第一只蜘蛛
你可能会觉得定义这个 Item 有点麻烦,但是定义它之后你会得到很多好处,这样你就可以在 Scrapy 中使用其他有用的组件和辅助类。
蜘蛛是你定义的类,Scrapy 用来从域(或域组)中抓取信息。在spider类中定义了一个初始的URL下载列表,以及如何跟随链接以及如何解析页面内容来提取Item。
要定义蜘蛛,只需扩展 scrapy.Spider 类并设置一些属性:
我们在coolscrapy/spiders文件夹下新建一个huxiu_spider.py,内容如下:
huxiu_spider.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: sample
Desc :
"""
from coolscrapy.items import HuxiuItem
import scrapy
class HuxiuSpider(scrapy.Spider):
name = "huxiu"
allowed_domains = ["huxiu.com"]
start_urls = [
"http://www.huxiu.com/index.php"
]
def parse(self, response):
for sel in response.xpath('//div[@class="mod-info-flow"]/div/div[@class="mob-ctt"]'):
item = HuxiuItem()
item['title'] = sel.xpath('h3/a/text()')[0].extract()
item['link'] = sel.xpath('h3/a/@href')[0].extract()
url = response.urljoin(item['link'])
item['desc'] = sel.xpath('div[@class="mob-sub"]/text()')[0].extract()
print(item['title'],item['link'],item['desc'])
运行爬虫
在根目录下执行以下命令,其中huxiu是你定义的蜘蛛名:
scrapy crawl huxiu
如果一切顺利,应该可以打印出每条新闻
手柄链接
如果你想继续关注每个新闻链接并查看其详细信息,可以在 parse() 方法中返回一个 Request 对象,然后注册一个回调函数来解析新闻详细信息。
from coolscrapy.items import HuxiuItem
import scrapy
class HuxiuSpider(scrapy.Spider):
name = "huxiu"
allowed_domains = ["huxiu.com"]
start_urls = [
"http://www.huxiu.com/index.php"
]
def parse(self, response):
for sel in response.xpath('//div[@class="mod-info-flow"]/div/div[@class="mob-ctt"]'):
item = HuxiuItem()
item['title'] = sel.xpath('h3/a/text()')[0].extract()
item['link'] = sel.xpath('h3/a/@href')[0].extract()
url = response.urljoin(item['link'])
item['desc'] = sel.xpath('div[@class="mob-sub"]/text()')[0].extract()
# print(item['title'],item['link'],item['desc'])
yield scrapy.Request(url, callback=self.parse_article)
def parse_article(self, response):
detail = response.xpath('//div[@class="article-wrap"]')
item = HuxiuItem()
item['title'] = detail.xpath('h1/text()')[0].extract()
item['link'] = response.url
item['posttime'] = detail.xpath(
'div[@class="article-author"]/span[@class="article-time"]/text()')[0].extract()
print(item['title'],item['link'],item['posttime'])
yield item
现在 parse 只提取感兴趣的链接,然后将链接内容解析传递给另一个方法进行处理。您可以基于此构建更复杂的爬虫程序。
导出爬网数据
保存抓取的数据最简单的方法是在本地保存为 json 文件,运行如下:
scrapy crawl huxiu -o items.json
在演示的小系统中,这种方法就足够了。但是,如果要构建复杂的爬虫系统,最好自己编写Item Pipeline。
将数据保存到数据库
上面我们介绍了抓取的item可以导出为json格式文件,但是最常见的做法是写一个Pipeline来存储到数据库中。我们在coolscrapy/pipelines.py中定义
# -*- coding: utf-8 -*-
import datetime
import redis
import json
import logging
from contextlib import contextmanager
from scrapy import signals
from scrapy.exporters import JsonItemExporter
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem
from sqlalchemy.orm import sessionmaker
from coolscrapy.models import News, db_connect, create_news_table, Article
class ArticleDataBasePipeline(object):
"""保存文章到数据库"""
def __init__(self):
engine = db_connect()
create_news_table(engine)
self.Session = sessionmaker(bind=engine)
def open_spider(self, spider):
"""This method is called when the spider is opened."""
pass
def process_item(self, item, spider):
a = Article(url=item["url"],
title=item["title"].encode("utf-8"),
publish_time=item["publish_time"].encode("utf-8"),
body=item["body"].encode("utf-8"),
source_site=item["source_site"].encode("utf-8"))
with session_scope(self.Session) as session:
session.add(a)
def close_spider(self, spider):
pass
上面我在python中使用了SQLAlchemy来保存数据库,这是一个很不错的ORM库,我写了一篇关于它的入门教程,大家可以参考一下。
然后在setting.py中配置这个Pipeline,以及数据库链接等信息:
ITEM_PIPELINES = {
'coolscrapy.pipelines.ArticleDataBasePipeline': 5,
}
# linux pip install MySQL-python
DATABASE = {'drivername': 'mysql',
'host': '192.168.203.95',
'port': '3306',
'username': 'root',
'password': 'mysql',
'database': 'spider',
'query': {'charset': 'utf8'}}