xcx:什么是爬虫呀?
shy:如果说网络像一张网,那么爬虫就是网上的一只小虫子,在网上爬行的过程中遇到了数据,就把它抓取下来。
shy:网络爬虫是一种按照一定的规则,自动请求万维网网站并提取网络数据的程序或脚本。注意:这里的数据是指互联网上公开的并且可以访问到的网页信息,而不是网站的后台信息(没有访问权限的),更不是用户注册的信息(非公开的)。
hwjw:爬虫具体能做些什么呢?
shy:搜索引擎、爬取图片、爬取用户公开联系方式进行营销、爬取网站用户公开信息进行分析、收集金融信息做投资分析、自动去除网页广告……
syf:什么是urllib库?
shy:urllib是Python内置的HTTP请求库,他可以看作是处理URL的组件集合。下面这篇文章就是使用urllib库爬取网页获取数据。
文章目录
问题描述:
爬取新浪股票吧的数据,其URL格式为https://guba.sina.com.cn/?s=bar&name=sh000300&type=0&page=3。分析其URL格式,并注意查看response的编码。要求股票代码由用户输入,同时输入起始页和结束页,把爬取到的网页保存成html文件。
Code:
import urllib.parse
import urllib.request
# from requests import get, post
import time
#enconding = 'utf-8'
def load_page(url, filename):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
return response.read().decode('gbk')
def write_page(html, filename):
print("正在保存", filename)
with open(filename, 'w', encoding='gbk') as file:
file.write(html)
def sina_stock_spider(stock_code, begin, end):
base_url = "https://guba.sina.com.cn/?s=bar&name={}&type=0&page="
for page in range(int(begin), int(end) + 1):
url = base_url.format(stock_code) + str(page)
print("正在爬取:", url)
html = load_page(url, "")
filename = f"D:\\sina_stock_{stock_code}_page_{page}.html"
write_page(html, filename)
time.sleep(1)
if __name__ == "__main__":
stock_code = input("请输入股票代码(如sh000300): ")
begin = input("请输入起始页码:")
end = input("请输入结束页码:")
sina_stock_spider(stock_code, begin, end)
分析:
导入模块
import urllib.parse
import urllib.request
import time
urllib.parse
:用于处理URL,但在这段代码中并没有实际使用到。urllib.request
:用于发起网络请求和接收响应。time
:用于在每次爬取后暂停一段时间,以避免过于频繁的请求。
定义函数 load_page(url, filename)
这个函数用于发起网络请求并获取页面内容。
url
:目标网页的URL。filename
:文件名,但在函数内部并未使用。
def load_page(url, filename):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
return response.read().decode('gbk')
- 定义了一个
headers
字典,用于模拟浏览器请求,避免被服务器拒绝服务。 - 使用
urllib.request.Request
创建一个请求对象,并传入自定义的headers
。 - 使用
urllib.request.urlopen
发起请求并获取响应对象。 - 读取响应内容,并使用
decode('gbk')
解码为字符串。新浪财经的页面使用gbk
编码,所以这里我们使用gbk
编码。
定义函数 write_page(html, filename)
这个函数用于将网页内容写入文件。
html
:要写入文件的网页内容。filename
:目标文件的名称。
def write_page(html, filename):
print("正在保存", filename)
with open(filename, 'w', encoding='gbk') as file:
file.write(html)
- 打印正在保存的文件名。
- 使用
with
语句打开文件,确保文件正确关闭。 - 指定文件打开模式为
'w'
,即写入模式。 - 设置文件编码为
gbk
,新浪财经使用的是gbk
编码。 - 将
html
内容写入文件。
定义函数 sina_stock_spider(stock_code, begin, end)
这个函数是爬虫的主要逻辑部分,用于爬取指定股票代码、起始页码和结束页码之间的所有页面。
def sina_stock_spider(stock_code, begin, end):
base_url = "https://guba.sina.com.cn/?s=bar&name={}&type=0&page="
for page in range(int(begin), int(end) + 1):
url = base_url.format(stock_code) + str(page)
print("正在爬取:", url)
html = load_page(url, "")
filename = f"D:\\sina_stock_{stock_code}_page_{page}.html"
write_page(html, filename)
time.sleep(1)
- 定义基础URL,其中
{}
会被股票代码替换。 - 使用
for
循环遍历起始页码到结束页码之间的所有页面。 - 构建具体的URL,通过
format
方法将股票代码和页码插入到URL中。 - 打印正在爬取的URL。
- 调用
load_page
函数获取页面内容。 - 构建文件名,并指定保存路径。
- 调用
write_page
函数将内容写入文件。 - 使用
time.sleep(1)
暂停一秒钟,避免过于频繁的请求。
主程序部分
if __name__ == "__main__":
stock_code = input("请输入股票代码(如sh000300): ")
begin = input("请输入起始页码:")
end = input("请输入结束页码:")
sina_stock_spider(stock_code, begin, end)
- 当该脚本作为主程序运行时,会执行此部分代码。
- 通过
input
函数获取用户输入的股票代码、起始页码和结束页码。 - 调用
sina_stock_spider
函数开始爬取数据。
注意事项和潜在问题
-
编码问题:
- 在
load_page
函数中,使用decode('gbk')
解码页面内容。如果新浪财经的页面编码发生变化,或者不是所有页面都使用gbk
编码,这可能会导致解码错误。最好是先检查页面的实际编码,或者使用更通用的解码方法(如utf-8
),或者根据响应头中的Content-Type
字段来确定编码。
- 在
-
异常处理:
- 代码中没有异常处理机制。网络请求可能会因为各种原因失败,比如网络连接问题、服务器错误等。应当添加
try-except
块来捕获和处理可能出现的异常。
- 代码中没有异常处理机制。网络请求可能会因为各种原因失败,比如网络连接问题、服务器错误等。应当添加
-
请求频率和限制:
time.sleep(1)
用于在每次请求后暂停一秒钟。这有助于避免对服务器造成过大的压力,但也可能导致爬虫速度过慢。如果服务器对请求频率有严格限制,可能需要调整这个时间间隔。- 另外,服务器可能会通过检查请求的
User-Agent
或其他头信息来识别爬虫,并拒绝服务。如果发生这种情况,可能需要进一步伪装爬虫,比如使用更复杂的User-Agent
字符串或旋转User-Agent
。
-
文件路径:
- 代码中硬编码了文件保存路径为
D:\\sina_stock_{stock_code}_page_{page}.html
。这意味着所有文件都将保存在D盘根目录下,且需要有写入权限。在实际应用中,最好使用相对路径或提供路径的输入选项。
- 代码中硬编码了文件保存路径为
-
资源消耗:
- 对于大量页面的爬取,可能会占用大量的磁盘空间和网络带宽。需要确保系统资源足够,并考虑爬取后的数据处理和存储方式。
-
爬虫合规性:
- 在进行网络爬虫开发时,必须遵守目标网站的
robots.txt
文件规定以及相关法律法规。有些网站可能不允许或限制爬虫访问,确保你的爬虫行为合法合规。
- 在进行网络爬虫开发时,必须遵守目标网站的
-
更新和维护:
- 网络结构和页面布局可能会随时间发生变化。这意味着爬虫代码可能需要根据实际情况进行更新和维护,以确保其继续有效。
-
性能优化:
- 如果需要爬取的页面数量非常大,可能需要考虑使用多线程或异步IO来提高爬虫的效率。
- 另外,如果目标网站支持API访问,使用API通常会比直接爬取页面更高效和稳定。
-
日志记录:
- 添加日志记录功能可以帮助跟踪爬虫的运行情况,包括成功爬取的页面、失败的请求、异常信息等。这对于调试和监控爬虫非常有帮助。
-
数据清洗和处理:
- 爬取下来的HTML数据可能需要进行进一步的数据清洗和处理,以提取出有用的信息。这通常涉及到使用正则表达式、XPath、BeautifulSoup等库来解析HTML结构。
在开发爬虫时,应当综合考虑以上因素,确保爬虫的稳定性、合规性和效率。