步履艰辛呀!自己不会做网络爬虫,只好去找教程例子!
当然自己也是有点小基础的!只是会读取简单的HTML网页代码!
对于这么复杂的代码,驾驭不住呦~
多个代码类型。我会分别列取出来的。
如果是代码的原作者,看到请联系我。我会标明来源地址的!
前言:
但是无论是谁的主页,都会出现这个人的主页。
已经有好多人都爬取到啦!
我爬取的所有链接的部分链接:
但是,这个链接:https://blog.csdn.net/yoyo_liyy/article/details/82762601
是不存在的。只能访问他的主页!就看到下面这个文章啦!
下面来说说我的历程吧!
依照我历程顺序的三个爬虫实例:
- 爬取所有文章的标题,以及文章的阅读量,还有文章的阅读量总和!
- 不区分原创还是转载。爬取所有文章的链接
- 区分原创还是转载。爬取所有文章的链接
好,接下来直接上源代码:
1,爬取所有文章的标题,以及文章的阅读量,还有文章的阅读量总和!
但是统计数量会出错误!
import requests
import re
sum = 0
pages = 9
x = 1
nn = []
base_url = "https://blog.csdn.net/weixin_42859280/article/list/"
for x in range(pages):
r = requests.get(base_url+str(x+1))
titles = re.findall(r'<span class="article-type type-.*?">\n.*?</span>\n(.*?)</a>', r.content.decode(), re.MULTILINE)
visits = re.findall( r'<span class="read-num">阅读数:(.*?)</span>', r.content.decode())
nn.append(visits)
nn = [int(x) for x in visits] #将阅读数转换为数字
mm = nn[1:-1]
for x, y in zip(titles, mm): #文章与阅读数组合
if y<100:
print(x, ": ",y)
sum += y
print(sum)
print(visits)
print(mm)
代码截图:
运行结果:
我的访问量:62921
但是阅读量出现错误啦!因为开头说的那个文章啦。所以就错位了。
还有,访问量是大于阅读量的!
因为:访问量=别人访问你主页次数+阅读文章次数总和!
所以这个可以大概看一下吧!不是完美的!
2,不区分原创还是转载。爬取所有文章的链接
但是,不能区分原创,还是转载!
这个历程,也让我收获了一个志同道合的好友。
下面的那个代码也是这个代码的作者写的!
代码:
import urllib.request
from bs4 import BeautifulSoup
#如果没有安装好BeautifulSoup,这里是会报错的
#自定义一个函数拿到博客的链接
def getUrl (url):
#定义一个headers,存储刚才复制下来的报头,模拟成浏览器
headers = ('User-Agent',
"Mozilla/5.0 (Windows NT 10.0; Win32; x32; rv:48.0) Gucko/20130101 Firefox/58.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 将opener安装为全局
urllib.request.install_opener(opener)
html = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')
bs = BeautifulSoup(html,'html.parser')
# 用beautifulsoup的select,找到所有的<a>标签
pages = bs.select(".pagination-box")
if pages:
# 判断是否包含下一页的选项
# 用beautifulsoup的select,找到所有的<a>标签
links = bs.select('.article-list > .article-item-box > h4 > a')
return links
else:
sys.exit()
# 要爬取的网页链接
import sys
if __name__ == '__main__':
count = 0
base_url = 'https://blog.csdn.net/weixin_42859280'
# 要爬取的网页链接 ,循环足够多的页数,所以填了1000000
for i in range(1,10):
#https://blog.csdn.net/weixin_42859280/article/list/2?orderby=ViewCount
url = base_url+'/article/list/'+str(i)+'?orderby=ViewCount'
# 获取对应网页的链接地址
linklist = getUrl(url)
# 定义一个列表texts存储文章的标题
texts = []
# 定义一个列表links存储文章的链接
links = []
# 遍历linkllist,存储标题和链接
for link in linklist:
texts.append(link.text.strip())
links.append(link.get('href'))
# 通过zip,将信息输出到控制台
print('\n')
for text, link in zip(texts, links):
text = text.strip().replace("原 \n ", "")
text = text.strip().replace("转 \n ", "")
data = {text,link}
ff = open('原创_文章标题.txt','a')
if count%10 ==0:
ff.write(str(count)+text+'\n\n')
else:
ff.write(str(count)+text+'\n')
ff.close()
ff = open('原创_链接.txt','a')
ff.write(link+'\n')
ff.close()
count+=1;
print("成功! 有",count,'个完成!')
#print(data)
#ff.close()
自己添加了一些写入的文件的操作:
跟爬虫有知识不同!
这个知识可以自行百度,挺简单的。
我的是在爬虫所在路径之下建立的文本文件,名字写入!
必须在同一个路径之下!才可以打开进行写入!
就是打开记事本,写入,关闭!
我的写入用的是追加手法!不会覆盖!
ff = open('原创_文章标题.txt','a')
if count%10 ==0:
ff.write(str(count)+text+'\n\n')
else:
ff.write(str(count)+text+'\n')
ff.close()
ff = open('原创_链接.txt','a')
ff.write(link+'\n')
ff.close()
count+=1;
print("成功! 有",count,'个完成!')
代码截图(一页放不下,两页来放呗!):
运行结果截图:
文本截图:
但是,还有待优化!
我与原作者进行了联系!进行了交流~
下面就是目前最优化的版本啦!
3,区分原创还是转载。爬取所有文章的链接
但是,阅读数和评论数不对。变量不能进行更新。
总是和第一篇文章(就是前面说的那个,每个人首页都会出现的!)一样!
这次优化,进行区分了原创,转载,阅读数(未成功),评论数(未成功)
总体代码,没有进行改变。就是改变了一下链接
链接地址:
https://blog.csdn.net/weixin_42859280/article/list?t=1
我又进行了一些改变,可以进行顺序控制!
这个是第三页!
链接地址:
https://blog.csdn.net/weixin_42859280/article/list/3?t=1&orderby=ViewCount
完整代码:
import requests
from bs4 import BeautifulSoup
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
def getOriginalArticle():
'''获取原创文章'''
for i in range(1,100):
#https://blog.csdn.net/weixin_42859280/article/list/3?t=1&orderby=ViewCount
#https://blog.csdn.net/weixin_42859280/article/list/2?orderby=ViewCount
#url = base_url+'/article/list/'+str(i)+'?orderby=ViewCount'
#url = 'https://blog.csdn.net/{}/article/list/{}?t=1'.format(username,i)
url = 'https://blog.csdn.net/weixin_42859280/article/list/'+str(i)+'?t=1&orderby=ViewCount'
web_data = requests.get(url, headers=header)
soup = BeautifulSoup(web_data.content, 'lxml')
pages = soup.select(".pagination-box")
if pages:
# 判断是否包含下一页的选项
# 用beautifulsoup的select,找到所有的<a>标签
links = soup.select('.article-list > .article-item-box > h4 > a')
readnum = soup.select('.read-num')
printOriginalData(links,readnum,'原 \n ')
else:
# 结束循环
break
def getTranshipmentArticle(username):
'''获取转载文章'''
for i in range(1,100):
url = 'https://blog.csdn.net/{}/article/list/{}?t=2'.format(username,i)
web_data = requests.get(url,headers=header)
soup = BeautifulSoup(web_data.content, 'lxml')
pages = soup.select(".pagination-box")
links = soup.select('.article-list > .article-item-box > h4 > a')
readnum = soup.select('.read-num')
if pages:
printTranshipmentData(links,readnum,'转 \n ')
else:
# 这里可能会有问题,因为我的转载文章还不够分页的数量,所以需要添加多一条printTranshipmentData()
printTranshipmentData(links, readnum, '转 \n ')
# 结束循环
break
def printTranshipmentData(links,readnum,stripText):
global n
for link in links:
url = link.get('href')
title = link.text.strip().replace(stripText, "")
read = readnum[0].text.strip("阅读数:")
comment = readnum[1].text.strip("评论数:")
data = {
'url': url,
'title': title,
'readnum': read,
'comment': comment
}
ff = open('转载_文章标题.txt','a')
if n%10 == 0:
#ff.write(str(n)+title+'阅读量:'+read+'评论数:'+comment+'\n\n')
ff.write(str(n)+title+'\n\n')
else:
ff.write(str(n)+title+'\n\n')
ff.close()
ff = open('转载_链接.txt','a')
ff.write(url+'\n')
ff.close()
n+=1;
print("转载文章! 有",n,'个完成!')
#print(data)
def printOriginalData(links,readnum,stripText):
global m
for link in links:
url = link.get('href')
title = link.text.strip().replace(stripText, "")
read = readnum[0].text.strip("阅读数:")
comment = readnum[1].text.strip("评论数:")
data = {
'url': url,
'title': title,
'readnum': read,
'comment': comment
}
ff = open('原创_文章标题.txt','a')
if m%10 == 0:
ff.write(str(m)+title+'\n\n')
else:
ff.write(str(m)+title+'\n\n')
ff.close()
ff = open('原创_链接.txt','a')
ff.write(url+'\n')
ff.close()
m+=1;
print("原创文章! 有",m,'个完成!')
#print(data)
if __name__ == '__main__':
username = "weixin_42859280"
n = 0
m = 0
getTranshipmentArticle(username)
print('\n\n------------------以下是原创文章--------------\n\n')
getOriginalArticle()
print('总文章数量:',n+m,'原创文章:',m,'篇! 转载文章:',n,'篇!')
代码截图(一页放不下三页来放!):
第一页:
第二页:
第三页:
先爬取得是转载的:
下图里面就是我说的不能实现的地方!
阅读量,评论数都是固定不变啦!
我也是进行了优化的!原来的文章没有依据排序输出功能!
我增加了进行降序输出!虽然在第二个里面就已经实现啦!
但是,目前也没有那么多时间功夫搞这个啦。
等以后我学学爬虫再搞吧!
哈哈,同时也感谢这位老哥帮助!
下面是他文章的链接,也就是我们最先相识的一个文章!
https://blog.csdn.net/stormdony/article/details/79828842#comments
其他文章,好像就一篇。原博主看到记得联系我!
收获颇丰!