记录自学简易的爬虫的过程
这里简单记录一下学习基础爬虫的过程,主要目的是熟悉python的语法,同时对爬虫的实现有一些好奇心。本人基础,学过C++,掌握python的基础语法。之前虽然一直想看看python爬虫的真面目,但是太过懒,终于下定决心想试试python爬虫。
小破站的python爬虫教程 Python爬虫编程基础5天速成(2021全新合集)Python入门+数据分析_哔哩哔哩_bilibili
从视频中可以学到python爬虫的大致是实现,但是看完后其实对于许多第三方库的使用还是不能达到理解使用的程度,只能模仿着写。
在本人自己写的一个小爬虫的时候,发现还要去学习很多东西。
1.在使用 BeautifulSoup
解析网页时,最好知道一些html的语法,可以参考HTML 教程 | 菜鸟教程 (runoob.com),同时可以看看Beautiful Soup 4.2.0 文档 — Beautiful Soup 4.2.0 documentation (crummy.com)加深对Soup的理解,可以处理更复杂的网页爬取。
2.在获取到网页后解析到我们需要的url等资源时,我们需要了解html语法和正则表达式(re)的使用,re可以先看正则表达式 – 教程 | 菜鸟教程 (runoob.com),再看Python3 正则表达式 | 菜鸟教程 (runoob.com)
3.把数据保存在excel可以直接看视频里的写法,但是那是一种在最后写数据的写法,如果要边爬边保存,要用到追加写入excel的写法(视频里是直接写一遍的写法),参考Python3对Excel表格操作(写入、追加)_夜风晚凉的博客-CSDN博客
本人爬的是一个自己比较感兴趣的网站,只是爬取了一些标题和链接,与小破站教程爬取豆瓣的代码结构基本是一样的,加入了一些自己的理解。因网站不宜传播,故代码无法直接运行,以下给出完整源代码,同时在github给出B站视频里老师写的豆瓣爬虫源代码。点击前往github地址
#-*- codeing = utf-8 -*-
#@Time : 2021/9/15
#@Auther : zqiusen
#@File : spidermp4.py
#@Softwar : VSCode
#@Python-V : python3.9.6
from bs4 import BeautifulSoup # 解析网页
import re # 正则表达式
import urllib.request, urllib.error # 由url获取网页数据
import xlwt
from xlrd import open_workbook
import xlrd
import openpyxl
from xlutils.copy import copy
# import sqlite3 #进行SQLitee数据库操作
import time
import random
def main():
baseurl = "******"
# 1.爬取网页
getData(baseurl)
findLink = re.compile(r"""<a href="(.*?)"><img""")
findTitle = re.compile(r"""</a><p><a href=".*?">(.*?)</a></p>""")
def getData(baseurl):
datalist = []
count = 0
#动漫最大页是258
for i in range(1,258):
url = baseurl + f'{i}.html'
time.sleep(random.random())
html = askUrl(url) # 获得每一页的网页源码
# 2.解析出网页中我需要的url
soup = BeautifulSoup(html, "html.parser")
# print(soup.ul)
for pin in soup.find_all('li', 'pin'):
title = re.findall(findTitle, str(pin))
# print("title:", title)
link = re.findall(findLink, str(pin))
if (len(link[0])) >= 3:
link = "https://*****" + link[0]
tmp = []
tmp.append(link)
print(title + tmp)
count += 1
datalist.append(title + tmp)
# 3.保存数据
savepath = "5gmp4.xls"
saveData(datalist, savepath, i)
datalist = []
print(f"完成第{i}页。")
print(f"爬取结束,共{count}个")
def askUrl(url):
head = { #模拟浏览器头部信息,向豆瓣服务器发送消息
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47"
}
request = urllib.request.Request(url,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
# print(html)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
def saveData(datalist, savepath):
print("Save......")
if count == 1:
book = xlwt.Workbook(encoding="utf-8", style_compression=0)
sheet = book.add_sheet("5gurl",cell_overwrite_ok=True)
col = ("title", "url")
for i in range(0, 2):
sheet.write(0, i, col[i])
book.save(savepath)
else:
workbook = xlrd.open_workbook(savepath) # 打开工作簿
# sheets = workbook.sheet_names() # 获取工作簿里的所有表格
worksheet = workbook.sheet_by_name("5gurl") # 获取工作簿中所有表格中的第一个表格
rows_old = worksheet.nrows # 获取表格中已存在的数据的行数
new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格
for i in range(0, 15):
for j in range(2):
new_worksheet.write(i+rows_old+1, j, datalist[i][j]) # 追加写入数据,注意从 i+rows_old 行开始
new_workbook.save(savepath)
# book = open_workbook(savepath)
# sheet = book.sheet_by_index(0)
# # 15*258 =
# count -= 1
# for i in range(count*15, count*15+15):
# num = 0
# data = datalist[num]
# num += 1
# for j in range(2):
# sheet.write(i+1, j, data[j])
# book.save(savepath)
def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
if __name__ == '__main__':
main()