2022年网络我的网络爬虫学习心得
写在前面
本文主要记录我自己从开始学习Python基础、接触爬虫、初次实现爬虫,再到独立完成爬虫项目并成功爬取以海外网()为爬取对象,一来是为了完成老师布置的作业,二来是为了留存下自己的学习记录,以便以后遗忘时重新回顾。随着人工智能的不断发展,爬虫这门技术也越来越重要,很多人都开启了学习爬虫,本文就介绍了一些爬虫学习的基础内容。
一、心得
在大三正式学习Python爬虫前,我在同学和老师们得帮助下,从廖雪峰得官方网站自学了部分的Python知识,还学习了部分C和C++等。
我个人在学习的过程中的体会是:Python是比较入门简单和省力高效的,而C和C++相比,在编程时需要更高的要求和复杂的编程逻辑,不太推荐于新手。但是据我了解,C相比于Python在许多数学方面函数的运算效率上是更高的。所以有句话:“简洁的代码不一定运行效率高”,因此我建议大家在学习编程的开头可以选择Python和C同时进行,一来方便实践编程技巧,二来也可以通过C语言更深刻的理解编程思想,为自己将来的编程大楼打下扎实的基础。
一个好的狙击手一定有一把趁手的武器,编程也是一样。我选择的是VScode,其中有许多优秀的插件,可以帮助我快速打代码。老师还带着我们安装了一些必备的工具,例如Anaconda、Pycharm、Mysql等。
python的功能很多,爬虫也只是其一个很小的功能,不过展开却有很大的学习空间。所以爬虫到底是个什么东西呢?
形象的解释:
如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据。
下面就给出书面化的定义:
网络爬虫也叫网络蜘蛛,它特指一类自动批量下载网络资源的程序,这是一个比较口语化的定义。
更加专业和全面对的定义是:网络爬虫是伪装成客户端与服务端进行数据交互的程序。
大数据时代来临,数据就是核心,数据就是生产力,越来越多的企业开始注重收集用户数据,而爬虫技术是收集数据的一种重要手段。一条一条手动记录数据的时代已经过去了,利用计算机进行全自动的记录才是可取的方式。于是,爬虫应运而生。当然,可是执行爬虫任务的不只可以使用Python,PHP,JAVA,C#,C++等同样可以,选择python是因为他相对来说操作比较简单,而且功能比较齐全。
在整个学习爬虫的过程中,特别感谢我的老师手把手带着我们一节节课走过来,还在课下耐心的解答。也感谢我的同学们在我遇到问题的时候不遗余力的帮助。
总而言之,大厦之成非一木之材,功成名就非一时之功,要想学好Python,学好网络爬虫,就得勤学多练,多多实践,遇到不会的问题多自己解决,带着问题学习才是最好的学习。
二、爬虫项目中所需要的pip模块 1.requests
requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,requests是Python语言的第三方的库,专门用于发送HTTP请求
2.bs4
Beautiful Soup 库一般被称为bs4库,支持Python3,是我们写爬虫非常好的第三方库。事实上,bs4库 是解析、遍历、维护、“标签树“的功能库。通俗一点说就是: bs4库把html源代码重新进行了格式化,从而方便我们对其中的节点、标签、属性等进行操作。
3.Pandas
Pandas 是基于NumPy的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
4.selenium
Selenium 是一个开源测试框架,用来对web应用(比如网站)做自动化测试用的,因为它可以驱动浏览器,诸如Chrome,Firefox,IE等,所以可以较为真实的模拟人自动去点击网站的各个按钮,翻页,填写表单等,这样节省了很多测试时间。
5.Scrapy
Scrapy不是一个函数功能库,而是一个爬虫框架。爬虫框架是实现爬虫功能的一个软件结构和功能组件集合;爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫。
6.gerapy_auto_extractor
gerapy-auto-extractor的Python项目详细描述Gerapy自动提取器这是Gerapy的自动提取器模块
三、简单爬虫实现 1.配置环境
打开WIN+R搜索cmd,输入如下代码。
#pip install pymongo
#pip install pymysql
2.简单爬虫实现(mysql)
打开WIN+R搜索cmd,输入如下代码。
import requests
from bs4 import BeautifulSoup
import pandas as pd
from urllib import parse
from sqlalchemy import create_engine
#%%
mysql_name = "root"
mysql_password = "glxy"
mysql_server = "localhost"
engine = create_engine("mysql+pymysql://{}:{}@{}:3306/temp?charset=utf8mb4".format(mysql_name,mysql_password,mysql_server))
#engine = create_engine("mysql+pymysql://【此处填用户名】:【此处填密码】@【此处填host】:【此处填port】/【此处填数据库的名称】?charset=utf8")
# 例如:engine = create_engine("mysql+pymysql://root:666666@localhost:3306/ajx?charset=utf8")
url = "http://health.people.com.cn/GB/408568/index{}.html"
num=1
data = []
while num<=5:
url_=url.format(num)
html = requests.get(url_)
html.encoding = "GB2312"
soup = BeautifulSoup(html.text,'lxml')
for i in soup.find_all("div",class_="newsItems"):
title = i.a.text
date = i.div.text
url_secondclass = parse.urljoin(url_,i.a["href"])
# url = "http://health.people.com.cn" + i.a["href"]
data.append((title,date,url_secondclass))
df = pd.DataFrame(data,columns=["title","date","url"])
print(df)#打印预览
#'list' object has no attribute 'to_sql'就是说只有dataframe才能使用to_sql
df.to_sql('people_health2',engine,if_exists='append',index=False,index_label=False)
num+=1
结果如图:
3.简单爬虫实现(mongo)
打开WIN+R搜索cmd,输入如下代码。
import pymongo
import json
import requests
from bs4 import BeautifulSoup
import pandas as pd
from urllib import parse
from sqlalchemy import create_engine
client = pymongo.MongoClient('127.0.0.1',27017)
database = client["NewsData"]
table = database["News"]
url = "http://health.people.com.cn/GB/408568/index.html"
html = requests.get(url)
html.encoding = "GB2312"
soup = BeautifulSoup(html.text,'lxml')
data = []
for i in soup.find_all("div",class_="newsItems"):
title = i.a.text
date = i.div.text
url = parse.urljoin(url,i.a["href"])
# url = "http://health.people.com.cn" + i.a["href"]
data.append((title,date,url))
df = pd.DataFrame(data,columns=["title","date","url"])
# df
data_ = json.loads(df.T.to_json())
data_
table.insert_many(data_.values())
结果如图:
四、Scrapy框架爬取海外网文章 1、Scrapy是什么? 1.1 Scrapy概述
Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试.
其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 后台也应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持.
1.2 Scrapy五大基本构成:
Scrapy框架主要由五大组件组成,它们分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。下面我们分别介绍各个组件的作用。
(1)、调度器(Scheduler):
调度器,说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是 什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。
(2)、下载器(Downloader):
下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。
(3)、 爬虫(Spider):
爬虫,是用户最关心的部份。用户定制自己的爬虫(通过定制正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
(4)、 实体管道(Item Pipeline):
实体管道,用于处理爬虫(spider)提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。
(5)、Scrapy引擎(Scrapy Engine):
Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。
1.3 建立爬虫项目整体架构图
本图按顺序说明整个程序执行时候发生的顺序。
注意在调用下载器时,往往有一个下载器中间件,使下载速度提速。
官网架构图
2、搭建Scrapy框架 2.1 下载安装Scrapy环境
代码如下(示例):
pip install scrapy==2.6.1
本文作者使用Windows系统,使用组合键Win+R并输入cmd打开终端,并在终端中输入图示代码
结果如图:
2.2 建立爬虫项目
首先进入我们创建爬虫项目的文件夹,点击右键进入Power Shell终端,使用如下代码创建新项目
代码如下(示例):
scrapy startproject NewsHaiwai
结果如图
2.3 配置Scrapy框架
首先进入我们创建的文件夹,作者使用的软件是VScode
可以看到,打开我们的NewsHaiwai文件夹,其中配置文件有四个:items.py、middleware.py、pipelines.py、settings.py。
(1)items.py的配置
代码如下(示例):
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class NewshaiwaiItem(scrapy.Item):
# define the fields for your item here like:
title = scrapy.Field()#标题
url = scrapy.Field()#网址
date = scrapy.Field()#日期
content = scrapy.Field()#文章正文
site = scrapy.Field()#站点
item = scrapy.Field()#栏目
本文作者使用Windows系统,使用组合键Win+R并输入cmd打开终端,并在终端中输入图示代码
结果如图:
(2)middlewares.py的配置
首先第一行添加
# -*- coding: utf-8 -*-
然后在最下边添加Header和IP类:
# 添加Header和IP类
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware#从scrapy.down...导入中心键
from scrapy.utils.project import get_project_settings
import random
settings = get_project_settings()
class RotateUserAgentMiddleware(UserAgentMiddleware):
def process_request(self, request, spider):
referer = request.url
if referer:
request.headers["referer"] = referer
USER_AGENT_LIST = settings.get('USER_AGENT_LIST')#创建一个UA列表,每次访问随机抽取一个
user_agent = random.choice(USER_AGENT_LIST)
if user_agent:
request.headers.setdefault('user-Agent', user_agent)
print(f"user-Agent:{user_agent}")
本文作者使用Windows系统,使用组合键Win+R并输入cmd打开终端,并在终端中输入图示代码
结果如图:
(3)pipelines.py的配置
代码如下(示例):
# -*- coding: utf-8 -*-
# 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
import pymongo
# useful for handling different item types with a single interface
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
class NewshaiwaiPipeline:
# class中全部替换
def __init__(self):
host = settings["MONGODB_HOST"]
port = settings["MONGODB_PORT"]
dbname = settings["MONGODB_DATABASE"]
sheetname = settings["MONGODB_TABLE"]
username = settings["MONGODB_USER"]#monggodb没有密码的情况下就把这两行注释掉即可
password = settings["MONGODB_PASSWORD"]
# 创建MONGODB数据库链接
client = pymongo.MongoClient(host=host, port=port, username=username, password=password)
#client = pymongo.MongoClient(host=host, port=port)#没有密码的时候
# 指定数据库
mydb = client[dbname]
# 存放数据的数据库表名
self.post = mydb[sheetname]
def process_item(self, item, spider):
data = dict(item)
# 数据写入
self.post.insert_one(data)#insert()/insert_one()适用于高版本python
return item
(4)settings.py的配置
首先在最上边添加:
# -*- coding: utf-8 -*-
然后将机器人协议选为不遵守(20行):
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
然后将中间件组件从注释中释放(54行),并按照如图修改:
# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
'NewsHaiwai.middlewares.RotateUserAgentMiddleware': 543,
}
然后将写入MONGODB组件从注释中释放(67行):
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'NewsData.pipelines.NewsdataPipeline': 300,
}
最后在下边添加如图所示代码,添加UA和MONGODB数仓设置:
USER_AGENT_LIST = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
# 添加MONGODB数仓设置
MONGODB_HOST = "localhost" # 数仓IP
MONGODB_PORT = 27017 # 数仓端口号
MONGODB_DATABASE = "NewsHaiwai" # 数仓数据库
MONGODB_TABLE = "News_Haiwai_A" # 数仓数据表单
2.4 创建爬虫python文件
在终端中使用如下代码,其中” “所代表的含义是目标引用的作用域是全域:
scrapy genspider haiwainet " "
结果如图:
3.编辑爬虫代码 3.1 编辑爬虫代码
在VScode中打开我们创建的爬虫python文件