前期准备:
两个包:urllib、xlwt
命令指示符中pip install解决~
课程要用到爬虫,所以先行做个学习吧。
百度搜索“Python爬虫”,很容易就出来这个文章:
[Python]新手写爬虫全过程(已完成)
感觉不错,里面是一个分析网页代码,然后爬取的,刚好之前接触过网页制作,而且没接触过的人按F12也很方便~
最重要的是,它提供的网站真是超级容易爬。。
提供的网站
推荐看看以后继续。
我只弄了前面三个函数出来,因为后面的有一些bug,如果你是Python3,import urllib可能还不足够,改成
import urllib.request
就可以了。
你可能会在这个代码中遇到乱码问题,问了一下百度,改进了他的getHtml函数,代码如下:
def getHtml(url):
#获取网页内容
page=urllib.request.urlopen(url)
html = page.read().decode("utf-8")
return html
对的,加个decode就行了。
然后做了适当的变化,我开始手痒了,打算爬这个网站上一级的标题。
上一级的网站
代码如下:
import urllib.request
######
# 爬虫v0.1 利用urlib 和 字符串内建函数
######
def getHtml(url):
# 获取网页内容
page = urllib.request.urlopen(url)
html = page.read().decode("utf-8")
return html
def content(html):
# 内容分割的标签
str = ''
content = html.partition(str)[2]
str1 = ''
content = content.partition(str1)[0]
return content # 得到网页的内容
def title(content, beg=0):
# 匹配title
# 思路是利用str.index()和序列的切片
try:
title_list = []
while True:
num1 = content.index('target="_blank"', beg)+16
num2 = content.index('', num1)
title_list.append(content[num1:num2])
beg = num2
except ValueError:
return title_list
content = content(getHtml("https://bh.sb/post/category/main/"))
title = title(content)
pageFile = open('wewantto.txt','w',encoding='utf-8')#以写的方式打开pageCode.txt
for i in title:
pageFile.write(i)#写入
pageFile.write('\n')
pageFile.close()#开了记得关
# 实现了爬的单个页面的title和img的url并存入文本
调整的地方在网址和content函数中str和str1,契合网站代码就行;加上了写到记事本的操作~
好的!实现了爬取
然后就是停不下来的手痒了:毕竟还是要爬一些大家熟悉的网站最好嘛
什么?你们说淘宝?我看看。。。
要登陆验证,我不玩了,太高深啦!
最后选择了B站,两个原因:
1、不需要登陆,爬数据也很方便!
2、翻页的时候网址变化很有规律!(在最后[&page=页数]的变化)
3、最多只显示50页,循环方便做!
在其中遇到了一个瓶颈,就是出现了 ‘str’ object is not callable的报错,试验了很久,发现这个函数只能被调用一次!我佛了,求大佬解答(现在没解决)
所以就是:我不管我不管,我要实现它!
解决方法:拆函数,具体代码如下:
import urllib.request
import xlwt
#实战爬取B站某页信息,v1.0
#初始化并创建一个工作簿
book = xlwt.Workbook()
#创建一个名为sheetname的表单
sheet = book.add_sheet('结果')
str0 = 'video-contain clearfix'
str1 = ''
for urlll in range(1,11):
url0="https://search.bilibili.com/all?keyword=%E9%BE%99%E7%8E%8B%E7%9A%84%E5%B7%A5%E4%BD%9C%EF%BC%81&from_source=banner_search&spm_id_from=333.334.b_62616e6e65725f6c696e6b.1&page="+str(urlll)
page=urllib.request.urlopen(url0)
getHtml = page.read().decode("utf-8")
content = getHtml.partition(str0)[2]
content = content.partition(str1)[0]
title_list = []
for m in content:
try:
num1 = content.index('target="_blank" title=', 0) + 23
num2 = content.index('" class', num1)
title_list.append(content[num1:num2])
content=content[num2:]
except:
break
kkk=20*urlll-20
for i in title_list:
sheet.write(kkk, 0, i)
kkk=kkk+1
#将工作簿以bookname命名并保存
book.save('wewantto.xls')
注意一下要写在Excel第一格的话,行列数应该从0开始。
这里简单地做了十页的结果,看起来是不错的。
(我试验的详情页?啊最近看的一部番,随便用着)
目前暂时这样子~