文章目录
- 一、学习心得
- 二、爬虫应用到的pip模块以及对应的功能
- 三、实验总结
- 1. 实验1:单个网页的爬取
- 2. 实验2:多个网站的爬取
- 2.1下载scrapy
- 2.2新建爬虫项目
- 2.2.1items的配置
- 2.2.2middlewares的配置
- 2.2.3pipelines的配置
- 2.2.4settings的配置
- 2.3创建news文件
- 2.3.1启动start_requests编辑
- 2.3.2列表解析parse
- 2.3.3内容解析parse_detail
- 2.3.4将爬取的结果存入mongodb中
- 3. 爬虫框里框架Gerapy的搭建流程
一、学习心得
python是一种很有潜力的高级语言,经过几年的发展,它已经成为了程序设计中的一个重要组成部分。这一学期,我也从 python课程中学到了一些关于 python的知识。在处理字符串时, python也比 c语言更方便。python不仅如此,它还有很多的库,正是由于 python有很多的库,所以让编程变得不再困难。不过,我觉得 python在很多方面都比 c语言更方便,但是它也有它的缺点,例如 for循环方面。虽然我在 python上的造诣还不是很深,但 python的强大还是让我很感兴趣,我想要继续研究下去,可以将 python学的更好。
本学期的课程独特之处在于它不像我们以前所学的别的课那样,需要用课本来背诵大量的知识。这门课的老师会带我们上机实操,能够更好的了解到实际的工作环境。在实际操作中,我遇到了各种各样的问题。比如初始环境安装,连接 MongoDB数据库,连接Mysql数据库等等,但是安装完成后,无法连接或者代码报错的问题层出不穷。但是解决了这些问题也只是跨入了爬虫学习的门槛。这令我意识到,爬虫的学习并不像表面上看起来的那样简单,在实验一和实验二中,我也遇到了许多问题。比如pycharm的配置、电脑系统不支持,为此我还重装了系统。后来跟着老师录的学习录像和老师在群里发的提示,慢慢做完实验和作业。令我意识到学习这些新颖的技术知识需要我们充分利用周围的资源。总的来说我认为想要学好一门编程语言,光学习基础知识和应对方法是不够的,必须要自己上手实操,从实际操作中发现并解决问题,以此来提高熟练度和达到自我的不断提升。
二、爬虫应用到的pip模块以及对应的功能
pip模块 | 简介 |
pandas | pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。 |
numpy | NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算 |
requests | Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 。 |
BeautifulSoup | BeautifulSoup是一个高效的网页解析库,可以从 HTML 或 XML 文件中提取数据。支持不同的解析器,比如,对HTML解析,对XML解析,对HTML5解析。一般情况下,我们用的比较多的是 lxml 解析器。 |
urllib | 在python2中,曾经有urllib和urllib2两个库来实现请求的发送,但目前通用的python3版本中,两个库的功能已经合并成一个库,统一为urllib,它是python内置函数,不需要额外安装即可使用。 |
pymysql | pymysql是一个连接mysql数据库的第三方模块,可作为连接mysql数据库的客户端,对数据库进行增删改查操作。 |
pymongo | pymongo是Python中用来操作MongoDB的一个库。 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,可以存储比较复杂的数据类型。 |
json | 模块json能够将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。 |
scrapy | Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。 |
gerapy | 是一个分布式爬虫管理框架。能帮助我们更方便地控制爬虫运行,更直观地查看爬虫状态,更实时地查看爬取结果,更简单地实现项目部署,更统一地实现主机管理 |
三、实验总结
1. 实验1:单个网页的爬取
流程描述:
1.确定抓取网站
2.访问抓取网站
3.页面解析
4.抓取数据
5.数据存储(存入mysql和mongodb)
import pandas as pd
import numpy as np
from pandas import DataFrame
import requests
from bs4 import BeautifulSoup
import pandas as pd
from urllib import parse
import pymysql
from sqlalchemy import create_engine
import sqlalchemy
import json
import pymongo
#调用数据包
url = "http://health.people.com.cn/GB/408568/index.html"
html = requests.get(url)
html.encoding = "GB2312"
#对爬取网站进行解码
soup = BeautifulSoup(html.text,'lxml')
list
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"])
print(title,date,url)
data.append((title,date,url))
#调用BeautifulSoup对该网页进行爬取
df = pd.DataFrame(data,columns=["title","date","url"])
df
#将爬取数据转换成df数据并定义标题
sql = 'insert into qiushi(title,date,url) values(%s,%s,%s) charset=utf8'
engine = create_engine('mysql+pymysql://root:123456@localhost/test1?charset=utf8')
df.to_sql( 'newlist1', con=engine, if_exists='append') #数据写入数据库
#运用sql、engine将数据写入数据库
client = pymongo.MongoClient('127.0.0.1',27017) #连接mongodb
database = client["NewsData"] #建立数据库
table = database["News"]
data_ = json.loads(df.T.to_json())
data_
#连接mongodb建立数据库建立集合并将爬取数据存入该集合
存储结果:
2. 实验2:多个网站的爬取
2.1下载scrapy
按住win+r打开输入cmd,在打开页面输入以下代码下载2.6.1版本
pip install scrapy==2.6.1
2.2新建爬虫项目
在桌面新建一个文件夹,进入新创建的scrapy框架文件夹,cmd打开命令窗口,输入scrapy startproject NewsData
,scrapy框架文件夹中会自动生成NewsData项目文件夹。
2.2.1items的配置
import scrapy
class NewsdataItem(scrapy.Item):
title = scrapy.Field() # 文章标题
url = scrapy.Field() # 文章链接
date = scrapy.Field() # 发布日期
content = scrapy.Field() # 文章正文
student_id = scrapy.Field() # 学生学号
site = scrapy.Field() # 站点
2.2.2middlewares的配置
#添加header
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
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')
user_agent = random.choice(USER_AGENT_LIST)
if user_agent:
request.headers.setdefault('user-Agent', user_agent)
print(f"user-Agent:{user_agent}")
2.2.3pipelines的配置
导入pymongo
import pymongo
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
创建mongodb数据库
class NewsdataPipeline:
# class中全部替换
def __init__(self):
host = settings["MONGODB_HOST"]
port = settings["MONGODB_PORT"]
dbname = settings["MONGODB_DATABASE"]
sheetname = settings["MONGODB_TABLE"]
#username = settings["MONGODB_USER"]
#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)
return item
2.2.4settings的配置
BOT_NAME = 'NewsData'
SPIDER_MODULES = ['NewsData.spiders']
NEWSPIDER_MODULE = 'NewsData.spiders'
#不遵守机器人协议
ROBOTSTXT_OBEY = False
#将DOWNLOADER_MIDDLEWARES注释解开加入中间件
DOWNLOADER_MIDDLEWARES = {
'NewsData.middlewares.RotateUserAgentMiddleware': 543,
}
#将ITEM_PIPELINES 注释解开用来执行pipelines函数
ITEM_PIPELINES = {
'NewsData.pipelines.NewsdataPipeline': 300,
}
#添加USER_AGENT_LIST
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 = "NewsData" # 数仓数据库
MONGODB_TABLE = "News_Process_A" # 数仓数据表单
2.3创建news文件
所选爬取网站为:星火作文网https://www.easyzw.com/zt/t407194/
创建一个python文件并打开
scrapy genspider new " "
2.3.1启动start_requests编辑
#调用scrapy,加载items文件中的newsdataitem字典, 在start_urls中输入所爬取的目标网址
import scrapy
from NewsData.items import NewsdataItem
from bs4 import BeautifulSoup
# from gerapy_auto_extractor.extractors import *
from urllib import parse
class NewsSpider(scrapy.Spider):
name = 'news'
allowed_domains = []
start_urls = [
['https://www.easyzw.com/html/yinianji/', '星火作文', '一年级作文'],
['https://www.easyzw.com/html/yinianji/list_39_2.html', '星火作文', '一年级作文'],
['https://www.easyzw.com/html/yinianji/list_39_3.html', '星火作文', '一年级作文'],
['https://www.easyzw.com/html/ernianji/', '星火作文', '二年级作文'],
['https://www.easyzw.com/html/sannianji/', '星火作文', '三年级作文'],
['https://www.easyzw.com/html/sinianji/', '星火作文', '四年级作文'],
['https://www.easyzw.com/html/wunianji/', '星火作文', '五年级作文'],
['https://www.easyzw.com/html/liunianji/', '星火作文', '六年级作文'],
['https://www.easyzw.com/html/chuyizuowen/', '星火作文', '初一作文'],
['https://www.easyzw.com/html/chuerzuowen/', '星火作文', '初二作文'],
['https://www.easyzw.com/html/chuyizuowen/', '星火作文', '初三作文'],
['https://www.easyzw.com/html/chusanzuowen/list_72_2.html', '星火作文', '初三作文'],
['https://www.easyzw.com/html/chusanzuowen/list_72_3.html', '星火作文', '初三作文'],
['https://www.easyzw.com/html/zhongkaozuowen/', '星火作文', '中考作文'],
['https://www.easyzw.com/html/gaoyi/', '星火作文', '高一作文'],
['https://www.easyzw.com/html/gaoerzuowen/', '星火作文', '高二作文'],
['https://www.easyzw.com/html/gaosanzuowen/', '星火作文', '高三作文'],
['https://www.easyzw.com/html/gaosan/list_119_2.html', '星火作文', '高三作文'],
['https://www.easyzw.com/html/gaosan/list_119_3.html', '星火作文', '高三作文'],
['https://www.easyzw.com/html/gaokaozuowen/', '星火作文', '高考作文'],
['https://www.easyzw.com/html/xieren/', '星火作文', '写人'],
['https://www.easyzw.com/html/xiejing/', '星火作文', '写景'],
['https://www.easyzw.com/html/xiangxiang/', '星火作文', '想象'],
['https://www.easyzw.com/html/dongwuzuowen/', '星火作文', '动物'],
['https://www.easyzw.com/html/zhouji/', '星火作文', '周记'],
['https://www.easyzw.com/html/duhougan/', '星火作文', '读后感'],
['https://www.easyzw.com/html/huanbaozuowen/', '星火作文', '环保'],
['https://www.easyzw.com/html/xinqing/', '星火作文', '心情'],
['https://www.easyzw.com/html/riji/', '星火作文', '日记'],
['https://www.easyzw.com/html/yilunwen/', '星火作文', '议论文'],
]
2.3.2列表解析parse
#在所选爬取网站中找到需要爬取的网页url、title、content的xpath写入
def start_requests(self):
for url in self.start_urls:
item = NewsdataItem()
item["site"] = url[1]
item["item"] = url[2]
yield scrapy.Request(url=url[0], meta={"item": item}, callback=self.parse)
#进行parse列表解析
def parse(self, response):
item = response.meta["item"]
site_ = item["site"]
item_ = item["item"]
title_list = response.xpath('//div[@class="main"]/ul//li/a/text()').extract()
url_list = response.xpath( '//div[@class="main"]/ul//li/a/@href').extract()
# date = response.xpath('//div[@class="info"]/text()[2]').extract()
# print(title_list)
for each in range(len(title_list)):
item = NewsdataItem()
item["title"] = title_list[each]
item["url"] = "https://www.easyzw.com/" + str(url_list[each])
item["site"] = site_
item["item"] = item_
yield scrapy.Request(url=item["url"], meta={"item": item}, callback=self.parse_detail)
2.3.3内容解析parse_detail
#使用response.xpath对爬取的网页的正文内容进行解析,并且将正文的xpath写入
def parse_detail(self, response):
item = response.meta["item"]
# item["date"] = ""
dat = response.xpath('//div[@class="info"]/text()[2]').extract_first()
strs = response.xpath('//div[@class="content"]').extract_first()
#使用 BeautifulSoup分析定义的 strs,然后把它放到item[“content”]里面,把“20201917”放到item[“student_id”]里面,然后返回item。
item["content"] = BeautifulSoup(strs, 'lxml').text
item["student_id"] = "20201917"
item["date"]=dat
return item
2.3.4将爬取的结果存入mongodb中
3. 爬虫框里框架Gerapy的搭建流程
搭建流程:
- 创建conda虚拟环境,起名为Gerapy,在虚拟环境下进行gerapy操作。
conda create -n Gerapy python=3.9
- 激活虚拟环境
comda activate Gerapy
- 安装gerapy
pip install gerapy
安装scrapyd,pywin32,gerapy_auto_extractor
pip install somepage
- 找到虚拟环境,在该文件夹下创建新的文件夹gerapy,cd进入。格式化文件,生成新的文件夹gerapy
gerapy init
- 数据迁移
gerapy migrate
- 创建超级用户
gerapy initadmin
- 运行gerapy runserver 0.0.0.0:8000
gerapy runserver 0.0.0.0:8000
- 打开一个新的命令,启动新的虚拟环境
conda activate gerapy
- 进入虚拟环境文件下的Scripts文件,启动scrapy脚本
安装scrapyd
pip install scrapyd
启动scrapy脚本
cd Scripts
scrapyd
两个cmd窗口都不要关闭,否则链接中断
10.打开浏览器输入127.0.0.1:8000
输入密码和用户名:为刚才创建的超级用户的名和密码
状态正常
11.将自己写的scrapy项目复制进这个文件夹下
12.打开项目管理,打包并部署
13.gerapy执行结果