爬虫抓取网页数据( Python语言开发专业Web开发的高级功能介绍及安装方法)
优采云 发布时间: 2021-10-12 07:17爬虫抓取网页数据(
Python语言开发专业Web开发的高级功能介绍及安装方法)
PyCharm 爬虫示例:使用 Scrapy 抓取网页特定内容
PyCharm 是一个 PythonIDE,带有一组工具,可以帮助用户在使用 Python 语言进行开发时提高效率,例如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试和版本控制。此外,IDE 提供了一些高级功能,以支持 Django 框架下的专业 Web 开发。
一、Scrapy 安装
1.Scrapy 介绍
Scrapy是为爬取网站数据和提取结构化数据而编写的应用框架。它可用于包括数据挖掘、信息处理或存储历史数据在内的一系列程序中。它最初是为页面抓取(更准确地说,网络抓取)而设计的,也可用于检索 API(例如 Amazon Associates Web Services)或一般网络爬虫返回的数据。
2.Scrapy 安装
推荐使用Anaconda安装Scrapy
Anaconda 是一个开源包和环境管理工件。Anaconda 收录 180 多个科学包及其依赖项,包括 conda 和 Python。从官网下载安装Anaconda(*敏*感*词*),根据自己的系统选择下载安装,选择next继续安装,Install for选项选择Just for me。选择安装位置后,等待安装完成。
安装完成后,打开命令行,输入conda install scrapy,根据提示按Y,就会下载Scrapy及其依赖的所有包,从而完成安装。
注意:使用命令行安装scrapy包时,会出现下载超时问题,即下载失败。我们可以通过修改其镜像文件来提高scrapy包的下载速度。可以参考博客:
这时测试Scrapy是否安装成功:在命令行窗口输入scrapy,回车。如果出现如下界面,则说明安装成功:
二、PyCharm 安装
1.PyCharm 介绍
PyCharm 是一个 PythonIDE,带有一组工具,可以帮助用户在使用 Python 语言进行开发时提高效率,例如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试和版本控制。此外,IDE 提供了一些高级功能,以支持 Django 框架下的专业 Web 开发。
2.PyCharm 安装
进入PyCharm官网,点击DownLoad下载。专业版在左边,社区版在右边。社区版免费,专业版免费试用。
如果之前没有下载过Python解释器,可以在等待安装的同时下载Python解释器,进入Python官网,根据系统和版本下载对应的压缩包。安装完成后,在环境变量 Path 中配置 Python 解释器的安装路径。参考课程:
三、Scrapy抢豆瓣项目实战
前提条件:如果想在PyCharm中使用Scrapy,必须先在PyCharm中安装支持的Scrapy包。流程如下,点击File>>Settings...,步骤如下,我安装Scrapy之前的绿框只有两个Package。如果点击后看到一个Scrapy包,则无需安装,直接进行下一步操作即可。
如果没有Scrapy包,点击“+”,搜索Scrapy包,点击Install Package进行安装
等待安装完成。
1.新项目
打开新安装的PyCharm,使用软件终端中的pycharm工具,如果找不到PyCharm终端,点击左下角的终端即可。
输入命令:scrapy startproject douban 这是使用命令行新建一个爬虫项目,如下图,图中项目名称为pythonProject
然后在命令行输入命令:cd douban进入生成项目的根目录
然后在终端继续输入命令:scrapy genspider douban_spider,生成douban_spider爬虫文件。
此时的项目结构如下图所示:
2.明确的目标
我们要练习的网站是:
假设,我们抓取top250电影的序列号、电影名称、介绍、星级、评分数量、电影描述选项
此时,我们在items.py文件中定义捕获的数据项,代码如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 序列号
serial_number = scrapy.Field();
# 电影名
movie_name = scrapy.Field();
# 介绍
introduce = scrapy.Field();
# 星级
star = scrapy.Field();
# 评价数
evaluate = scrapy.Field();
# 描述
describe = scrapy.Field();
pass
3.接下来需要制作爬虫并存储爬取的内容
在douban_spider.py爬虫文件中编写具体逻辑代码,如下:
# -*- coding: utf-8 -*-
import scrapy
from ..items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = 'douban_spider'
# 允许的域名
allowed_domains = ['movie.douban.com']
# 入口URL
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
#循环电影的条目
for i_item in movie_list:
#导入item,进行数据解析
douban_item = DoubanItem()
douban_item['serial_number'] = i_item.xpath(".//div[@class='item']//em/text()").extract_first()
douban_item['movie_name'] = i_item.xpath(".//div[@class='info']//div[@class='hd']/a/span[1]/text()").extract_first()
#如果文件有多行进行解析
content = i_item.xpath(".//div[@class='info']//div[@class='bd']/p[1]/text()").extract()
for i_content in content:
content_s ="".join( i_content.split())
douban_item['introduce'] = content_s
douban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()
douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()
douban_item['describe'] = i_item.xpath(".//p[@class='quote']/span/text()").extract_first()
print(douban_item)
yield douban_item
#解析下一页,取后一页的XPATH
next_link = response.xpath("//span[@class='next']/link/@href").extract()
if next_link:
next_link = next_link[0]
yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse)
这个时候不需要运行这个python文件,因为我们不是单独使用它,所以不需要运行它。允许报错。关于import引入的问题,关于home目录的绝对路径和相对路径的问题,原因是我们使用了相对路径。“..Items”,对相关内容感兴趣的同学可以上网查找对此类问题的解释。
4.存储内容
将抓取到的内容存入json或csv格式的文件中
在命令行输入:scrapy crawl douban_spider -o test.json 或者scrapy crawl douban_spider-o test.csv
将抓取到的数据存储在 json 文件或 csv 文件中。
执行 crawl 命令后,将鼠标焦点放在项目面板上时,将显示生成的 json 文件或 csv 文件。打开json或者csv文件后,如果里面什么都没有,那么我们需要进一步修改,修改代理USER_AGENT的内容,
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.8 Safari/537.36'
如果存储在一个json文件中,所有的内容都会以16进制的形式显示,可以通过相应的方法进行转码。这里就不多解释了,如下图所示:
并且保存在csv文件中,会直接显示我们要抓取的所有内容,如下图:
至此,我们已经完成了对网站具体内容的抓取。接下来,我们需要处理爬取的数据。
分割线
分割线
Scraoy 介绍示例二——使用Pipeline来实现
在这次实战中,需要重新创建一个项目,或者需要安装scrapy包。参考以上内容,新建项目的方法也参考以上内容,这里不再赘述。
项目目录结构如下图所示:
一、管道介绍
当我们通过Spider爬取数据,通过Item采集数据时,需要对数据进行处理,因为我们爬取的数据不一定是我们想要的最终数据,可能还需要进行数据清洗和校验。数据的有效性。Scripy 中的 Pipeline 组件用于数据处理。Pipeline 组件是一个收录特定接口的类。它通常只负责一个功能的数据处理。可以在一个项目中同时启用多个管道。
二、在items.py中定义要捕获的数据
首先打开一个新的pycharm项目,通过终端新建一个项目教程,在item中定义要抓取的数据,比如电影的名字,代码如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
pass
class DoubanmovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
moiveName = scrapy.Field()
三、定义pipeline.py文件
每个item管道组件都是一个独立的pyhton类,必须通过process_item(self, item, spider)方法实现。每个 itempipeline 组件都需要调用这个方法。该方法必须返回一个带有数据的dict,或者一个item对象,否则抛出DropItem异常,丢弃的item将不会被后续的管道组件处理。定义的 pipelines.py 代码如下:
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class TutorialPipeline(object):
def process_item(self, item, spider):
return item
import time
class DoubanmoviePipeline(object):
def process_item(self, item, spider):
now = time.strftime('%Y-%m-%d', time.localtime())
fileName = 'douban' + now + '.txt'
with open(fileName, 'a', encoding='utf-8') as fp:
fp.write(item['moiveName'][0]+"\n")
return item
四、配置setting.py
由于这次用到了管道,我们需要在settings.py中打开管道通道注释,在管道中添加一条新的记录,如下图所示:
五、写爬虫文件
在tutorial/spiders目录下创建quotes_spider.py文件,目录结构如下,编写初步代码:
quotes_spider.py 的代码如下:
import scrapy
from items import DoubanmovieItem
class QuotesSpider(scrapy.Spider):
name = "doubanSpider"
allowed_domains = ['douban.com']
start_urls = ['http://movie.douban.com/cinema/nowplaying',
'http://movie.douban.com/cinema/nowplaying/beijing/']
def parse(self, response):
print("--" * 20 )
#print(response.body)
print("==" * 20 )
subSelector = response.xpath('//li[@class="stitle"]')
items = []
for sub in subSelector:
#print(sub.xpath('normalize-space(./a/text())').extract())
print(sub)
item = DoubanmovieItem()
item['moiveName'] = sub.xpath('normalize-space(./a/text())').extract()
items.append(item)
print(items)
return items
六、通过启动文件运行
在豆瓣文件目录下新建一个启动文件douban_spider_run.py(文件名可取),运行该文件查看结果。编写代码如下:
from scrapy import cmdline
cmdline.execute("scrapy crawl doubanSpider".split())
最后,处理后的爬取数据如下图(部分):
最后,希望大家在写代码的时候能更加小心,不要马虎。在我的实验中,要引入的方法DoubanmovieItem写成DobanmovieItem,导致整个程序失败,PyCharm没有告诉我在哪里。我错了。我到处搜索,但找不到解决问题的方法。最后查了很多次,才发现方法是什么时候生成的,所以一定要小心。此错误如下图所示。它说找不到DobanmovieItem的模块。它可能已经告诉我错误的地方,因为我太傻了没有找到,所以花了很长时间。希望大家多多指教!
至此,使用Scrapy对网页内容进行爬取,并对爬取的内容进行清理和处理的实验已经完成。要求熟悉和使用这个过程中的代码和操作,不会在网上找内容消化。吸收,记在脑子里,这才是真正的知识学习,不是葫芦娃图。
PyCharm爬虫示例:这里介绍使用Scrapy爬取网页特定内容。更多Python学习请参考编程字典Python教程和问答部分。感谢您对编程词典的支持。
原文链接: