之前看了某位博主的访问量爬取代码,自己想在此基础上再爬一个文章标题。查阅一些博客和资料后选择正则表达式进行文章标题的爬取。方法比较笨拙,如有看官,还请多担待,本人不是很擅长爬虫。
- 语言:Python
- 版本:Python3.8
- 使用模块:re、requests、time、random、datetime
- 集成开发环境:Pycharm
一、模块介绍
-
re模块:re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用。(python内置模块,无需单独安装)
正则表达式语法:学习正则表达式
正则表达式在线工具:可在编程环境外进行方便的单独测试,观察所书写的正则表达式是否合乎要求
本次共用到两个正则表达式
第一个是从网页数据中提取出阅读量的信息:<span.*?read-count.*?(\d+).*?</span>
第二个是从网页数据中提取出标题的信息:>.{0,}</h1>
(略显幼稚~)
方法:随意打开一篇CSDN文章,按F12打开开发者工具,从中找到包含阅读量的标签。
方法:鼠标在右边的标签上移动时,左边对应的数据会高亮,移动到阅读量的数据高亮时,就找到了包含阅读量的标签,此刻可知包含阅读量的标签格式为:<span class="read-count">阅读量</span>
,再根据这个标签写出正则表达式。 -
requests模块:该模块是用的比较多的HTTP请求库,可以方便的进行网页爬取。(非内置模块,需要安装)
安装方法:pip install requests
可能会有超时错误,原因是python官网是外国网站,国内访问速度较慢,此时可选择使用国内的豆瓣源进行安装:
pip install requests -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com
requests库详解:有关该模块的详细介绍
requests库的基本使用方法:该模块的基本的使用方法
官方文档,一言难尽~ -
time模块:用于处理时间问题,提供了一系列的操作时间的函数。(Python内置模块,无需安装)
time模块常用方法:有关time模块的简单用法介绍。
本次只使用到了time模块的sleep(方法),主要用于延时,防止激发反爬机制 -
random模块:该模块用于生成随机数(用于延时用)
random的用法:有关random模块的简单用法介绍。
本次用到的方法是random.randint(60, 83),用于生成60-83之间的随机数 -
datetime模块:提供用于处理日期和时间的类,此处仅供输出时间作提醒用。
datetime的使用方法:有关datatime的简单用法介绍。
爬取CSDN文章的标题和访问量代码如下所示
import re
import requests
from requests import RequestException
import time
import random
import datetime
def get_title(html):
try:
regex = ">.{0,}</h1>"
read_title = re.compile(regex).search(html)
read_title = read_title.__str__()
lens = len(read_title)
begin = read_title.index("match") + 8
read_title = read_title[begin:lens - 7]
# print("当前文章的标题是:"+read_title)
return read_title
except Exception:
print('寻找标题出错')
return None
def get_page(url):
try:
headers = {
'Referer': 'https://blog.csdn.net', # 伪装成从CSDN博客搜索到的文章
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
# 伪装成浏览器
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
return None
except RequestException:
print('请求出错')
return None
def parse_page(html):
try:
read_num = int(re.compile('<span.*?read-count.*?(\d+).*?</span>').search(html).group(1))
return read_num
except Exception:
print('解析出错')
return None
def dst(url):
html = get_page(url)
if html:
read_title = get_title(html)
if read_title != None:
print('当前文章:', read_title)
read_num = parse_page(html)
if read_num:
print('当前阅读量:', read_num)
def main():
try:
while 1:
print("now time is : " + nowTime())
url = "https://blog.csdn.net/CSDNsabo/article/details/104778542"
dst(url)
sleep_time = random.randint(60, 83)
# sleep_time = random.randint(30, 50)
url = "https://blog.csdn.net/CSDNsabo/article/details/112723065"
dst(url)
sleep_time = random.randint(60, 83)
# sleep_time = random.randint(30, 50)
print('please wait', sleep_time, 's')
time.sleep(sleep_time) # 设置访问频率,过于频繁的访问会触发反爬虫
except Exception:
print('出错啦!')
def nowTime():
curr_time = datetime.datetime.now()
curr_time.date()
return curr_time.__str__()
if __name__ == '__main__':
main()