爬取网页信息并保存

bs4和lxml都是用来将接收的数据解析html

1.bs4+excel(openpyxl):

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook wb = Workbook()
sheet = wb.active
sheet.title = '豆瓣读书Top250'
header = ['书名', '评分', '链接']
sheet.append(header)
headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' }
res = requests.get('https://book.douban.com/top250', headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
items = soup.find_all(class_='item')
for i in items:
tag = i.find(class_='pl2').find('a')
rating = i.find(class_='rating_nums').text
name = tag['title']
link = tag['href']
row = [name, rating, link]
sheet.append(row)
wb.save('豆瓣.xlsx')

2.bs4+csv

import requests
from bs4 import BeautifulSoup
import csv
with open('豆瓣.csv', 'w', newline='') as file:
csv_writer = csv.writer(file)
header = ['书名', '评分', '链接']
csv_writer.writerow(header)
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}
res = requests.get('https://book.douban.com/top250', headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
items = soup.find_all(class_='item')
for i in items:
tag = i.find(class_='pl2').find('a')
rating = i.find(class_='rating_nums').text
name = tag['title']
link = tag['href']
row = [name, rating, link]
csv_writer.writerow(row)

3.lxml+csv

#  导入相关的库
from lxml import etree
import requests
import csv # 运用Python中的csv库,把爬取到的信息存储在本地的CSV文件中 # 新建一个csv文件
# Permission denied
# 重复使用同一个csv文件会出现[没有权限;拒绝访问]
with open('douban.csv','w',newline='',encoding='utf-8') as fp:
# csv.writer()中可以传一个文件对象
writer = csv.writer(fp)
# 写入表头信息
writer.writerow(('name', 'url', 'author', 'publisher', 'date', 'price', 'rate', 'comment')) # 构造urls
urls = 'https://book.douban.com/top250' # 加入请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
# 用requests库获取网页信息,lxml解析html文件
html = requests.get(urls, headers=headers)
selector = etree.HTML(html.text)
# 取大标签,以此类推
# <tr class='item'>
infos = selector.xpath('//tr[@class="item"]')
for info in infos:
# IndexError: list index out of range
name = info.xpath('td/div/a/@title')[0]
print(name)
url = info.xpath('td/div/a/@href')[0]
# /text 是获取到定位元素的文本值
book_infos = info.xpath('td/p/text()')[0]
# print(book_infos)
author = book_infos.split('/')[0]
publisher = book_infos.split('/')[-3]
date = book_infos.split('/')[-2]
price = book_infos.split('/')[-1]
rate = info.xpath('td[2]/div[2]/span[2]/text()')[0]
comments = info.xpath('td/p/span/text()')
comment = comments[0] if len(comments) != 0 else "空" # 打印查看结果
print(name, url, author, publisher, date, price, rate, comment)
# 将上述的数据写入到csv文件
writer.writerow((name, url, author, publisher, date, price, rate, comment)) # 关闭csv文件
fp.close()

4.lxml+excel(openpyxl)

#  导入相关的库
from lxml import etree
import requests
from openpyxl import Workbook #excel库 # 构造urls
urls = 'https://book.douban.com/top250'
wb = Workbook() # 在本地创建Excel工作簿
sheet = wb.active # 激活worksheet
sheet.title = '豆瓣读书Top250'
header = ['name', 'url', 'author', 'publisher', 'date', 'price', 'rate', 'comment']
sheet.append(header)
headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' }
html = requests.get(url=urls, headers=headers)
selector = etree.HTML(html.text)
# 取大标签,以此类推
# <tr class='item'>
infos = selector.xpath('//tr[@class="item"]')
for info in infos:
# IndexError: list index out of range
name = info.xpath('td/div/a/@title')[0]
url = info.xpath('td/div/a/@href')[0]
# /text 是获取到定位元素的文本值
book_infos = info.xpath('td/p/text()')[0]
# print(book_infos)
author = book_infos.split('/')[0]
publisher = book_infos.split('/')[-3]
date = book_infos.split('/')[-2]
price = book_infos.split('/')[-1]
rate = info.xpath('td[2]/div[2]/span[2]/text()')[0]
comments = info.xpath('td/p/span/text()')
comment = comments[0] if len(comments) != 0 else "空"
row = [name, url, author, publisher, date, price, rate, comment]
sheet.append(row)
wb.save('豆瓣.xlsx')

5.bs4+excel(xlwt)

import re  # 正则表达式,进行文字匹配
# import bs4 #只需要使用bs4中的BeautifulSoup因此可以如下写法:
from bs4 import BeautifulSoup # 网页解析,获取数据
import xlwt # 进行excel操作
import sqlite3 # 进行SQLlite数据库操作
import urllib.request, urllib.error # 指定url,获取网页数据 def main():
# 爬取的网页
baseurl = "https://movie.douban.com/top250?start="
# # 保存的路径
savepath = ".\\豆瓣电影Top250.xls" # 使用\\表示层级目录或者在整个字符串前加r“.\豆瓣电影Top250”
savepath2Db = "movies.db"
# # 1.爬取网页
# print(askURL(baseurl))
datalist = getData(baseurl)
print(datalist)
# # 3.保存数据(存储到excel中)
saveData(datalist, savepath) # 影片详情链接的规则
findLink = re.compile('<a href="(.*?)">') # 创建正则表达式对象
# 影片图片的链接规则
findImgSrc = re.compile('<img alt=".*src="(.*?)"', re.S) # re.S忽略换行
# 影片片名
findTitle = re.compile('<span class="title">(.*)</span>')
# 影片评分
findRating = re.compile('<span class="rating_num" property="v:average">(.*)</span>')
# 评价人数
# findJudge = re.compile('<span>(\d*)(.*)人评价</span>')
findJudge = re.compile('<span>(\d*)人评价</span>')
# 概况
findInq = re.compile('<span class="inq">(.*)</span>')
# 影片相关内容
findBd = re.compile('<p class="">(.*?)</p>', re.S) # 中间有</br>,因此要忽略换行符 # 爬取网页
def getData(baseurl):
datalist = []
for i in range(0, 10): # 一页25条电影
url = baseurl + str(i*25)
html = askURL(url) # 保存获取到的网页源码
# print(html)
# 2.解析数据(逐一)
soup = BeautifulSoup(html, "html.parser") # 使用html.parser解析器解析html文档形成树形结构数据
for item in soup.find_all("div", class_="item"): # 查找符合要求的字符串,形成列表
# print(item)
data = [] # 保存一部电影的信息
item = str(item)
# 影片详情链接
link = re.findall(findLink, item)[0]
data.append(link)
# 图片
img = re.findall(findImgSrc, item)[0]
data.append(img)
# 标题
titles = re.findall(findTitle, item)
if(len(titles) == 2):
ctitle = titles[0] # 中文名
data.append(ctitle)
otitle = titles[1].replace("/", "")
data.append(otitle) # 外文名
else:
data.append(titles[0])
data.append(' ') # 外文名留空
# data.append(title)
# 评分
rating = re.findall(findRating, item)[0]
data.append(rating)
# 评价人数
judgeNum = re.findall(findJudge, item)[0]
# print(judgeNum)
data.append(judgeNum)
# 添加概述
inq = re.findall(findInq, item)
if len(inq) == 0:
data.append(" ")
else:
data.append(inq[0].replace("。", ""))
# 影片相关内容
bd = re.findall(findBd, item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd) # 去掉</br>
bd = re.sub('/', " ", bd) # 替换/
data.append(bd.strip()) # 去掉前后的空格 datalist.append(data) # 把处理好的一部电影的信息保存
# for it in datalist:
# print(it)
return datalist # 得到执行url的网页信息
def askURL(url):
# 头部信息 其中用户代理用于伪装浏览器访问网页
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/87.0.4280.88 Safari/537.36"}
req = urllib.request.Request(url, headers=head)
html = "" # 获取到的网页源码
try:
response = urllib.request.urlopen(req)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"): # has attribute
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html def saveData(datalist, savepath):
book = xlwt.Workbook(encoding="utf-8", style_compression=0) # style_compression:压缩的效果
sheet = book.add_sheet("豆瓣电影top250", cell_overwrite_ok=True) # 单元格内容可覆盖
col = ("电影详情链接", "图片链接", "影片中文名", "影片外文名", "评分", "评价数", "概述", "相关信息") # 元组添加表头
for i in range(8): # 写入表头(列名)
sheet.write(0, i, col[i]) for i in range(1, len(datalist)+1):
for j in range(len(datalist[i-1])):
sheet.write(i, j, datalist[i-1][j])
book.save(savepath) if __name__ == '__main__':
main()

python爬取网页的多种方式以及保存方法的更多相关文章

  1. python爬取网页的通用代码框架

    python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...

  2. Python爬取网页信息

    Python爬取网页信息的步骤 以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例. 1.确认网址 在浏览器中输入初 ...

  3. 如何使用python爬取网页动态数据

    我们在使用python爬取网页数据的时候,会遇到页面的数据是通过js脚本动态加载的情况,这时候我们就得模拟接口请求信息,根据接口返回结果来获取我们想要的数据. 以某电影网站为例:我们要获取到电影名称以 ...

  4. python爬取某个网站的图片并保存到本地

    python爬取某个网站的图片并保存到本地 #coding:utf- import urllib import re import sys reload(sys) sys.setdefaultenco ...

  5. 使用 Python 爬取网页数据

    1. 使用 urllib.request 获取网页 urllib 是 Python 內建的 HTTP 库, 使用 urllib 可以只需要很简单的步骤就能高效采集数据; 配合 Beautiful 等 ...

  6. 利用Python爬取网页图片

    最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: Python 3.6官网下载 我们这里以sogou作为爬取的对象. 首先我们进入搜狗图片 ...

  7. python 爬取网页简单数据---以及详细解释用法

    一.准备工作(找到所需网站,获取请求头,并用到请求头) 找到所需爬取的网站(这里举拉勾网的一些静态数据的获取)----------- https://www.lagou.com/zhaopin/Pyt ...

  8. python 爬取网页内的代理服务器列表(需调整优化)

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-30 20:38:23 # @Author : EnderZhou (z ...

  9. python爬取网页文本、图片

    从网页爬取文本信息: eg:从http://computer.swu.edu.cn/s/computer/kxyj2xsky/中爬取讲座信息(讲座时间和讲座名称) 注:如果要爬取的内容是多页的话,网址 ...

  10. 第14.1节 通过Python爬取网页的学习步骤

    如果要从一个互联网前端开发的小白,学习爬虫开发,结合自己的经验老猿认为爬虫学习之路应该是这样的: 一. 了解HTML语言及css知识 这方面的知识请大家通过w3school 去学习,老猿对于html总 ...

随机推荐

  1. Day29:StringBuilder详解

    StringBuilder 1.1 StringBuilder概述 我们先对普通的String字符串对象建立进行内存分析: public class Demo{ public static void ...

  2. JUC面试点汇总

    JUC面试点汇总 我们会在这里介绍我所涉及到的JUC相关的面试点内容,本篇内容持续更新 我们会介绍下述JUC的相关面试点: 线程状态 线程池 Wait和Sleep Synchronized和Lock ...

  3. 【Shell案例】【小数点scale&bc】14、求平均值

    描述写一个bash脚本以实现一个需求,求输入的一个的数组的平均值 第1行为输入的数组长度N第2~N行为数组的元素,如以下为:数组长度为4,数组元素为1 2 9 8示例:41298 那么平均值为:5.0 ...

  4. org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException

    1.问题概述 将一个 springboot 项目打成 Jar 包后,在本地使用 java -jar 命令启动服务,服务能启动成功,但是会有如下报错信息. 说明: 配置文件为外置配置文件,与 jar 处 ...

  5. Boolean.getBoolean() 与 Boolean.parseBoolean()

    1. 问题回顾 当在不了解 Boolean 中的 getBoolean() 方法与 parseBoolean() 方法的区别时,在使用过程中就会出现不明所以的bug. 比如如下使用情况: // isA ...

  6. socket模块/TCP协议/黏包处理

    socket模块 如果我们需要编写基于网络进行数据交互的程序 意味着我们需要自己通过代码来控制我们之前 所学习的OSI七层(很繁琐 很复杂 类似于我们自己编写操作系统) socket类似于操作系统 封 ...

  7. 真正“搞”懂HTTP协议06之body的玩法(理论篇)

    本来啊,本来,本来我在准备完善这个鸽了四年的系列的时候,是打算按照时间的顺序来完成的,好吧.我承认那个时候考虑的稍稍稍稍稍微有些不足,就是我忽略了HTTP协议的"模块性".因为虽然 ...

  8. Qt操作Json小结

    Qt操作Json 1.QJsonDocument 1.详细说明 QJsonDocument类提供了读写JSON文档的方法. QJsonDocument是一个封装了完整JSON文档的类,可以从基于UTF ...

  9. 【爬虫+数据分析+数据可视化】python数据分析全流程《2021胡润百富榜》榜单数据!

    目录 一.爬虫 1.1 爬取目标 1.2 分析页面 1.3 爬虫代码 1.4 结果数据 二.数据分析 2.1 导入库 2.2 数据概况 2.3 可视化分析 2.3.1 财富分布 2.3.2 年龄分布 ...

  10. Vue中实现自定义excel下载

    目录 第一种:后端生成excel 第二种:前端合成excel 总结 参考资料 最近在工作中遇到一个需求,就是需要在前端实现一个错误模板Excel的下载功能. 实现下载有两种方式,一种是后端生成一个ex ...