前言
如今,随着AI技术日渐成熟,大家对互联网的关注也越来越多,人工智能等相关领域迅速爆火,程序猿也成为香饽饽。在这个属于大数据的时代,信息爆炸式增长,数据的提取与过滤就显得尤为重要。为了跟上时代的潮流亦或是为了便利自己的生活等其他原因,许多普通人甚至学生也开始学习编程。而python,作为最快上手的语言之一,以其简单灵活的语法和丰富的三方库受到大家欢迎。
什么是网络爬虫?
网络爬虫(web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
简而言之,网络爬虫就是你用代码编写的一种程序,它能根据程序将网络上某些你需要的特定的或有价值的数据“拿过来”,从而实现自动化批量的数据抓取,大大减少了如人力、财力等资源的消耗。
爬虫有啥用?
事实上,也许你只是听说了网络爬虫技术的火爆和方便而点进这篇文章,却不知道它究竟好在哪,那么我必须给出一些例子:相信很多读者一定有过抢票的经历,每每看着“已售完”的灰色按钮都气的想摔爆手上的“-5G”手机,但想到自己一个月几k的工资又只能化悲愤为一声叹气。但你并不知道的是,和你抢票的对手是每秒点击成百上千次的“机器人",它们大多是用不同语言编写出来的程序脚本,属于爬虫的一种。
除此之外,爬虫也广泛运用于商业领域,假若你是一个上市公司boss,你想开拓新的业务,购入新产品,那么,你可以运用python爬虫在互联网上抓取顾客对新产品的评价反馈,评估什么商品最具经济潜力。
假如您是一位普通员工,爬虫可以帮助您更高效地完成工作,为家庭或个人腾出更多时间。此外,在文章结尾,我将附上顶点小说网站的爬虫源代码作为引例。(在我看来,这绝对是对新手非常友好的例子,我将爬虫的基本步骤分成了几个自定义函数,便于学习)
怎么写爬虫?
(注意:我所使用的编程语言为python,学C和C++的天才们快快退让)
编程不是程序猿的专属,例如,我就不是程序员,事实上,我们中的很多人是出于对编程技术的好奇与热爱,秉承提高自我能力的目的接触了这个领域。
言归正传,为了写一个符合需求的高质量爬虫,你需要握编最基本的语法知识(当然,也许我在以后的文章中会发布0基础使用爬虫模板的方法,但这种东西在网上比比皆是,很难让你与别人拉开差距)后续我也会发布一些文章帮助新手快速入门,不同于其他教程,我将以学会爬虫为目标,除去大量繁杂的语法点,做到真正的快速入门。
其二,写一个爬虫程序的过程大致如下(我以自己的经验为参考,做到最符合普通人的使用需求):
1.明确需求,搜集信息。也就是说,你需要清楚你想获得什么数据或资源,资源的路径也就是网址是什么。在这个阶段,也可以大致浏览网页的HTML架构。
2.编写爬虫程序:这一步,我们将用到python中的requests库和进行数据提取的库(如re正则表达,lxml,beautifulsoup等)基本方法是先发送请求,获取网页源代码,然后从中提取你需要的信息。
3.调试和修改:解决bug,修改代码使之更符合需求。
4.倒杯coffee,点击运行,坐等结果。
相信你看完有点蒙,html是什么?requests库是什么?怎么提取数据?放心,我将在下一篇文章中以下面顶点小说网站的爬虫源代码为例详细讲解,你可以先尝试理解其中的含义,注意,这段代码无法直接运行,你需要在HEADER参数添加自己电脑的请求头,这种私人信息还是不要外露咯,探索互联网的过程也别忘了保护好自己,做个守法公民
此代码只用作教学演示,不得用于商业牟利
创作不易,点个赞吧
import os, requests, lxml.html
import re
from multiprocessing.dummy import Pool
# import time
HEADER = {
}
result_page = {}
def get_source(url,header,verify):
session = requests.Session()
source = session.get(url, headers=header, verify=verify).text
return source
def content_xpath(source, xpath):
selector = lxml.html.fromstring(source)
result = selector.xpath(xpath)
return result
def get_page(bage):
for i in bage:
href = bage[0]
name = bage[1]
source_page = get_source(url=href,header=HEADER,verify=False)
page_add = re.findall('<div id="htmlContent"><p>(.*?)<', source_page)[0]
page = re.findall('br>(.*?)<', source_page)
page.insert(0,page_add)
# page = content_xpath(source=source_page,xpath='//div[@id="htmlContent"]/p/text()')
result_page['{}'.format(name)] = page
# if len(result_page) == 10:
# time_out = time.time()
# print(time_out - time_start)
# print(result_page)
# pool.close()
# pool.join()
def save_file(list,dict, book_name):
os.makedirs(book_name, exist_ok=True)
for i in range(len(list)):
with open(os.path.join(book_name, list[i][1] + '.txt'),'w',encoding='utf-8') as f:
for page in dict[list[i][1]]:
f.write(page + '\n\n')
def main(book_url):
source_chapter = get_source(url=book_url,header=HEADER,verify=False)
book_name = content_xpath(source_chapter, '//title/text()')[0]
chapter_href_primary = content_xpath(source_chapter, '//td[@class="L"]/a/@href')
chapter_name = content_xpath(source_chapter,'//td[@class="L"]/a/text()')
chapter_href = []
for i in chapter_href_primary:
i = 'https://www.xiaoshuopu.com' + i
chapter_href.append(i)
lis_all = []
for i in range(len(chapter_name)):
tup = tuple([chapter_href[i]])+tuple([chapter_name[i]])
lis_all.append(tup)
# time_start = time.time()
pool = Pool(10)
pool.map(get_page,lis_all)
save_file(list=lis_all, dict=result_page, book_name=book_name)
if __name__ == '__main__':
book_url = 'https://www.xiaoshuopu.com/xiaoshuo/9/9270/'
# book_url = 'https://www.xiaoshuopu.com/xiaoshuo/45/45461/'
main(book_url)