300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > python从零开始学爬虫_从零开始学爬虫(爬取豆瓣) 一看就会

python从零开始学爬虫_从零开始学爬虫(爬取豆瓣) 一看就会

时间:2024-02-21 19:00:13

相关推荐

python从零开始学爬虫_从零开始学爬虫(爬取豆瓣) 一看就会

一、 准备工作

语言:python

编辑器:pycharm

需要导的包:bs4、re、urllib、xlwt(可以通过左上角file->settings->project->interpreter->右边加号导包)

爬虫就是编写程序模拟浏览器打开网页获取需要的内容

二、 构建流程

from bs4 import BeautifulSoup #网站解析,获取数据

import re #正则表达式

import urllib.request,urllib.error #指定url

import xlwt #excel操作

import sqlite3 #数据库操作

def main():

baseurl = "/top250?start="

#获取数据

datalist = getData(baseurl)

#保存文件

savepath = ".\\豆瓣.xls"

saveData(datalist, savepath)

#askUrl(baseurl)

pass

#获取爬取的网页数据

def getData(baseurl):

datalist = []

return datalist

#得到指定一个url的网页内容,后面会将urllib的使用

def askUrl(url):

#用户代理 表明是什么类型的浏览器

head = {

"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.102Safari / 537.36"

}

req = urllib.request.Request(url=url,headers=head)

html = ''

try:

res = urllib.request.urlopen(req)

html = res.read().decode('utf-8')

return html

except urllib.error.URLError as e:

if hasattr(e,"code"):

print(e.code)

pass

if hasattr(e,"reason"):

print(e.reason)

pass

pass

#保存数据

def saveData(datalist, savepath):

pass

main()

三、各种工具的使用

1、urllib的使用

urllib 是一个收集了多个涉及 URL 的模块的包:

urllib.request 打开和读取 URL

urllib.error 包含 urllib.request 抛出的异常

urllib.parse 用于解析 URL

urllib.robotparser 用于解析 robots.txt 文件

所以我们可以新建一个testUrllib.py文件,单独测试下urllib的使用

import urllib.request,urllib.error,urllib.parse

#首先定义一个url

url = ""

#设置header的user-agent原因是如果不设置,会显示user-agent:python-urllib,从而有时候爬取失败,所以要伪装成是用浏览器打开

headers = {

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"

}

#post 将传递的data数据包装起来

data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding='utf-8')

#发出request请求

req = urllib.request.Request(url=url,headers=headers,method='POST',data=data)

res = urllib.request.urlopen(req)

#获取数据 可以看到获取的是豆瓣网的代码,后面我们将对这些内容进行解析获取需要的内容

print(res.read().decode('utf=8'))

2、bs4 BeautifulSoup的使用

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.

下面有几个常用方法,更多详细的使用可以去看官方文档

from bs4 import BeautifulSoup

import re

file = open("./baidu.html","rb")

html = file.read()

bs = BeautifulSoup(html,"html.parser")

# print(bs.title.string)

# t_list = bs.find_all("a")

# print(t_list)

# 正则表达式搜索

# t_list = bs.find_all((pile("a")))

#方法搜索

# def name_is(tag):

# return tag.has_attr("name")

# t_list = bs.find_all(name_is)

# for i in t_list:

# # print(i)

# print(t_list)

#关键字查找

# t_list = bs.find_all(id="head")

# for i in t_list:

# print(i)

#text参数

# t_list = bs.find_all(text="hao123")

# for i in t_list:

# print(i)

# pass

#

# t_list = bs.find_all(text=pile("\d"))

# for i in t_list:

# print(i)

#llimit参数

t_list = bs.find_all("a",limit=3)

for i in t_list:

print(i)

3、xlwt的使用

xlwt 是 Python 用来在 Excel 写入数据和格式化数据的工具包

下面以九九乘法表为例

import xlwt

workbook = xlwt.Workbook(encoding='utf-8') #创建对象

worksheet = workbook.add_sheet('sheet1') #创建表单 sheet1对应下图标注处

for i in range(0,9):

for j in range(0,i+1):

#将内容写进表单中

worksheet.write(i,j,"%d * %d = %d"%(i+1,j+1,(i+1)*(j+1)))

pass

pass

#将写好的存放到excel中

workbook.save('student.xls') #这里的student.xls是文件名

四、正式开始

from bs4 import BeautifulSoup #网站解析,获取数据

import re #正则表达式

import urllib.request,urllib.error #指定url

import xlwt #excel操作

def main():

baseurl = "/top250?start="

#获取数据

datalist = getData(baseurl)

#保存文件

savepath = ".\\豆瓣.xls"

saveData(datalist, savepath)

pass

#这里使用正则表达式,导入的re包,解析获取的网页内容

#找到链接

findLink = pile(r'')#创建正则表达式对象,表示规则

#找到海报

findImgSrc = pile(r'

#找到标题

findTitle = pile(r'(.*)')

#找到评分

findRate = pile(r'(.*)')

#找到评价人数

findPerson = pile(r'(\d*)人评价')

#找到概况

findInq = pile(r'(.*)')

#找到影片相关内容

findBd = pile(r'

(.*?)

', re.S)

#爬取网页

def getData(baseurl):

datalist = []

for i in range(0, 10): #获取10次 这里是因为爬取的是top250 所以知道有250个

url = baseurl + str(i*25)

html = askUrl(url) #保存爬取的网页

#2.逐一解析数据

soup = BeautifulSoup(html, "html.parser")

for item in soup.find_all('div', class_="item"):#查找符合要求的字符串 这里的class后要加个下划线

data = [] #保存一部电影的信息

item = str(item)

# print(item)

#获取到影片详情的链接

link = re.findall(findLink, item)[0] #正则表达式查找指定的字符串

data.append(link) #添加链接

imgSrc = re.findall(findImgSrc, item)[0] # 正则表达式查找指定的字符串

data.append(imgSrc)#添加海报

title = re.findall(findTitle, item)

if(len(title) == 2):#添加片名

ctitle = title[0]

data.append(ctitle) #添加中文名

otitle = title[1].replace("/", "")

data.append(otitle)#添加外文名

pass

else:

data.append(title[0])

data.append(' ')#留空 为了excel处可以对齐

pass

per = re.findall(findPerson, item)[0]

data.append(per)#添加评价人数

rating = re.findall(findRate, item)[0]

data.append(rating)#添加评分

inq = re.findall(findInq, item) #添加概述

if len(inq):

inq = inq[0].replace("。", "")

data.append(inq)

pass

else:

data.append(" ")

pass

bd = re.findall(findBd, item)[0]

bd = re.sub('

(\s+)?', " ", bd)

bd = re.sub('/', " ", bd)

data.append(bd.strip()) #添加

datalist.append(data)

pass

pass

print(datalist)

return datalist

#得到指定一个url的网页内容

def askUrl(url):

#用户代理 表明是什么类型的浏览器

head = {

"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.102Safari / 537.36"

}

req = urllib.request.Request(url=url,headers=head)

html = ''

try:

res = urllib.request.urlopen(req)

html = res.read().decode('utf-8')

return html

except urllib.error.URLError as e:

if hasattr(e,"code"):

print(e.code)

pass

if hasattr(e,"reason"):

print(e.reason)

pass

pass

#保存数据

def saveData(datalist, savepath):

workbook = xlwt.Workbook(encoding='utf-8', style_compression=0) # 创建对象

worksheet = workbook.add_sheet('豆瓣电影250', cell_overwrite_ok=True) # 创建表单

col = ('电影详情链接', "图片链接", "影片中文名", "影片外文名", "评分", "评分数", "概况", "相关信息")

#设置表头

for i in range(0, 8):

worksheet.write(0, i, col[i])

pass

#将解析后的内容写入excel表中

for i in range(0, 250):

print("第{}条".format(i))

data = datalist[i]

for j in range(0, 8):

worksheet.write(i+1, j, data[j])

pass

pass

workbook.save(savepath)

pass

#运行

main()

结果图如下:

初识爬虫,还存在各种问题,希望大家可以批评指正

我感觉就是解析网页时候可能会有点问题吧

原文链接:/Two_Bits/article/details/108561338

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。