作为一名大数据管理与应用专业的学生,经过一学期的网络爬虫学习,我意识到在生活中或是未来工作中,网络爬虫是我可以利用的一种高效工具。网络爬虫技术在科学研究、Web安全、产品研发等方面都起着重要作用。在数据处理方面,如果没有数据就可以通过爬虫从网上筛选抓取自己想要的数据。并且伴随着网络技术的发展,我们早已进入信息爆炸的时代,面对繁冗的数据,我们很难从里面提取到有价值的数据,为了解决传统人工收集数据的不便的问题,通过利用爬虫技术就可以轻松找到自己想要的数据。在本学期的学习中虽然遇到了很多困难,通过一次次的纠正,不断地找出问题所在,最后解决问题。这仿佛是一条登山之路,比起唾手可得的成功,向上攀登的路程更加令我振奋,我相信这也是学习爬虫技术的意义之一。
二、pip模块
pandas是Python的一个数据分析包,其纳入了大量库和一些数据模型,提供了操作大型数据的集所需要的工具。它可以帮助清理数据并且处理数据,提供了大量能使我们快速便捷地处理数据的函数和方法。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。很多计算机软件包都用numpy数组为操作对象。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
urllib库最大的作用就是可以去设定相关的头部信息然后和网站建立请求连接,请求连接建立完成后就能够去获取到网页的整体数据了,这也是python爬虫脚本实现的核心。同时urllib库还可以去访问到网页的robots.txt文件从而得知这网页的访问规则是什么,能够在在抓取数据返回之后对数据进行相关的解析。
一个mongodb中可以建立多个数据库。mongodb的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
json主要用来数据传输,是一种取代xml的数据结构,可以方便阅读和编写,同时也便于机器进行解析和生成。
scrapy是适用于Python的一个高层次的屏幕抓取和网站抓取框架,用于抓取网站站点并从页面中提取机构化的数据。可用于数据监测、数据挖掘等方面。
requests库的主要作用就是和网页进行连接,根据使用方法的不同从而 进行不同的操作处理。
sqlalchemy是Python编程语言下的一款orm框架,此框架建立在数据库api之上,使用关系对象映射进行数据库操作。通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。
1.搭建scrapy环境
2.配置items、pipelines、middlewares、settings四文件,添加mongodb数仓设置。
3.编辑执行网络爬虫文件。
1.配置items文件,使用简单的类定义语法和Field 对象来声明要抓取的内容。
1. title = scrapy.Field() #文章标题
2. url = scrapy.Field() #文章链接
3. date = scrapy.Field() #发布日期
4. content = scrapy.Field() #文章正文
5. site = scrapy.Field() #网站名
6. item = scrapy.Field() #类别
7. student_id = scrapy.Field() #学生学号姓名
2.配置middlewares文件。
1. #调取配置信息
2. from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
3. from scrapy.utils.project import get_project_settings
4. import random
5.
6. settings = get_project_settings()
7.
8.
9. class RotateUserAgentMiddleware(UserAgentMiddleware):
10. def process_request(self, request, spider):
11. referer = request.url
12. if referer:
13. request.headers["referer"] = referer
14. USER_AGENT_LIST = settings.get('USER_AGENT_LIST') #客户端列表
15. user_agent = random.choice(USER_AGENT_LIST) #随机抽取
16. if user_agent:
17. request.headers.setdefault('user-Agent', user_agent)
18. print(f"user-Agent:{user_agent}")
3.配置pipelines文件,添加必备包和加载设置。 创建MONGODB数据库链接,指定数据库,数据写入。
1. import pymongo #加载pymongo
2.
3. from scrapy.utils.project import get_project_settings
4.
5. settings = get_project_settings() #加载mongodb用户名,密码,端口号。ip地址
(2) 创建MONGODB数据库链接
1. def __init__(self):
2. host = settings["MONGODB_HOST"]
3. port = settings["MONGODB_PORT"]
4. dbname = settings["MONGODB_DATABASE"]
5. sheetname = settings["MONGODB_TABLE"]
6. username = settings["MONGODB_USER"]
7. password = settings["MONGODB_PASSWORD"]
8. client = pymongo.MongoClient(host=host, port=port, username=username, password=password)
无用户名和密码
1. host = settings["MONGODB_HOST"]
2. port = settings["MONGODB_PORT"]
3. dbname = settings["MONGODB_DATABASE"]
4. sheetname = settings["MONGODB_TABLE"]
5. client = pymongo.MongoClient(host=host, port=port)
(3) 指定数据库
1. mydb = client[dbname]
(4) 存放数据的数据库名
1. self.post = mydb[sheetname]
(5) 数据写入
1. def process_item(self, item, spider):
2. data = dict(item)
3. self.post.insert_one(data)
4.配置settings文件。
(1) 将ROBOTSTXT_OBEY = True
1. 改为ROBOTSTXT_OBEY = False
(2) 将DOWNLOADER_MIDDLEWARES注释解开加入中间件
1. DOWNLOADER_MIDDLEWARES = {
2. 'NewsData.middlewares.RotateUserAgentMiddleware': 543,
3. }
(3) 将ITEM_PIPELINES 注释解开用来执行pipelines函数
1. ITEM_PIPELINES = {
2. 'NewsData.pipelines.NewsdataPipeline': 300,
3. }
(4) 添加USER_AGENT_LIST
1. USER_AGENT_LIST = [
2. "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",
3. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
4. "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
5. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
6. "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
7. "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
8. "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
9. "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
10. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
11. "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
12. "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",
13. "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
14. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
15. "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
16. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
17. "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
18. "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
19. "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
20. ]
(5)添加MONGODB数仓设置
1. MONGODB_HOST = "localhost" # 数仓IP
2. MONGODB_PORT = 27017 # 数仓端口号
3. MONGODB_DATABASE = "NewsData" # 数仓数据库
4. MONGODB_TABLE = "News_Process_A" # 数仓数据表单
5. 用表格展示抓取网站的频道或栏目列表
1. start_urls = [
2. ('http://www.yzs.com/zhongshitekan/zhongshitekanzhongshijian/', '中诗网', '中诗简牍', '20201912张粲'),
3. ('http://www.yzs.com/wenrenshuhua/', '中诗网', '文人书画', '20201912张粲'),
4. ('http://www.yzs.com/zhongshitushu/', '中诗网', '中诗图书', '20201912张粲'),
5. ('https://www.yzs.com/zhgshg/shirenfangzhen/', '中诗网', '诗人方阵', '20201912张粲'),
6. ('https://www.yzs.com/shigewanlixing/', '中诗网', '诗行天下', '20201912张粲'),
7. ('https://www.yzs.com/zhongshizhuanti/kangjixinxingfeiyan/', '中诗网', '抗击新冠肺炎', '20201912张粲'),
8. ('https://www.yzs.com/zhongshizhuanti/80houshigedazhan/', '中诗网', '80后诗歌大展', '20201912张粲'),
9. ('https://www.yzs.com/zhongshizhuanti/90houshigedazhan/', '中诗网', '90后诗歌大展', '20201912张粲'),
10. ('https://www.yzs.com/zhongshizhuanti/zgwrshz2022/', '中诗网', '中国文人书画展', '20201912张粲'),
11. ('http://www.yzs.com/wenrenshuhua/xinwenzhanlan/', '中诗网', '新闻展览', '20201912张粲'),
12.
13. ]
6.scrapy爬虫步骤,创建爬虫并启动。
1. import scrapy
2. from NewsData.items import NewsdataItem
3. from bs4 import BeautifulSoup
4. from urllib import parse
5. import urllib
确认爬取网站:
1. allowed_domains = []
1. start_urls = [
2. ('http://www.yzs.com/zhongshitekan/zhongshitekanzhongshijian/', '中诗网', '中诗简牍', '20201912张粲'),
3. ('http://www.yzs.com/wenrenshuhua/', '中诗网', '文人书画', '20201912张粲'),
4. ('http://www.yzs.com/zhongshitushu/', '中诗网', '中诗图书', '20201912张粲'),
5. ('https://www.yzs.com/zhgshg/shirenfangzhen/', '中诗网', '诗人方阵', '20201912张粲'),
6. ('https://www.yzs.com/shigewanlixing/', '中诗网', '诗行天下', '20201912张粲'),
7. ('https://www.yzs.com/zhongshizhuanti/kangjixinxingfeiyan/', '中诗网', '抗击新冠肺炎', '20201912张粲'),
8. ('https://www.yzs.com/zhongshizhuanti/80houshigedazhan/', '中诗网', '80后诗歌大展', '20201912张粲'),
9. ('https://www.yzs.com/zhongshizhuanti/90houshigedazhan/', '中诗网', '90后诗歌大展', '20201912张粲'),
10. ('https://www.yzs.com/zhongshizhuanti/zgwrshz2022/', '中诗网', '中国文人书画展', '20201912张粲'),
11. ('http://www.yzs.com/wenrenshuhua/xinwenzhanlan/', '中诗网', '新闻展览', '20201912张粲'),
12.
13. ]
定义内容字段
1. def start_requests(self):
2. for url in self.start_urls:
3. item = NewsdataItem()
4. item["site"] = url[1]
5. item["item"] = url[2]
6. item["student_id"] = url[3]
7.
8.
9. yield scrapy.Request(url=url[0], meta={"item": item}, callback=self.parse)
(2)列表解析
使用xpath定位文章的标题,日期,网址.
1. def parse(self, response):
2.
3. item = response.meta["item"]
4.
5. site_ = item["site"]
6. item_ = item["item"]
7. student_id_ = item["student_id"]
8.
9. title_list = response.xpath('//div[@class="blogs-list"]/ul/li/h2/a/text()').extract()
10. url_list = response.xpath('//div[@class="blogs-list"]/ul/li/h2/a/@href').extract()
(3)自动翻页的设置
1. next_url = response.xpath('//div[@class="pagelist"]/a[10]/@href').extract_first()
2. if next_url:
3. next_url = urllib.parse.urljoin(response.url, next_url)
4. self.page_link.add(next_url)
5. yield scrapy.Request(next_url, meta={"item": item}, callback=self.parse)
(4)内容解析
1. for each in range(len(title_list)):
2. item = NewsdataItem()
3. item["title"] = title_list[each]
4. item["url"] = urllib.parse.urljoin(response.url, str(url_list[each]))
5. item["site"] = site_
6. item["item"] = item_
7. item["student_id"] = student_id_
8. item["date"] = ""
9.
10. yield scrapy.Request(url=item["url"], meta={"item": item}, callback=self.parse_detail)
11. parse_detail(self, response):
12.
13. item = response.meta["item"]
14. strs = response.xpath('//div[@class="newstext"]').extract_first()
15. item["content"] = BeautifulSoup(strs, 'lxml').text
16. return item
(5)数据存储
1. def __init__(self):
2. host = settings["MONGODB_HOST"]
3. port = settings["MONGODB_PORT"]
4. dbname = settings["MONGODB_DATABASE"]
5. sheetname = settings["MONGODB_TABLE"]
6. #username = settings["MONGODB_USER"]
7. #password = settings["MONGODB_PASSWORD"]
8. # 创建MONGODB数据库链接
9. #client = pymongo.MongoClient(host=host, port=port, username=username, password=password)
10. client = pymongo.MongoClient(host=host, port=port)
11. # 指定数据库
12. mydb = client[dbname]
13. # 存放数据的数据库表名
14. self.post = mydb[sheetname]
15.
16. def process_item(self, item, spider):
17. data = dict(item)
18. # 数据写入
19. self.post.insert_one(data)
20. return item
7.数据库结果
1.安装gerapy,安装scrapyd。
pip install gerapy
pip install scrapyd
2.启动程序
(1)初始化
新建文件夹,打开目录行输入
gerapy init
(2)数据迁移
文件夹中出现gerapy文件夹,进入文件夹输入
gerapy migrate
(3)创建用户,密码为admin
gerapy intadmin
(4)启动
gerapy runserver 0.0.0.0:6000/
(5)打开gerapy,在浏览器中输入http://127.0.0.1:6000/,输入密码进入。
(6)打包部署、任务执行。