python 爬取网页 通知消息_Python爬取网页信息
Python爬取网页信息的步骤
我们采用该网站(https://nameberry.com/)作为数据源,并提取每个用户的评论信息和详细记录时间。
1、确认网址
在浏览器中输入初始网址,逐层查找链接,直到找到需要获取的内容。
当访问页面时,在目标位置进行内容定位操作之前,请您执行以下步骤:首先右键点击菜单栏中的某个项目,在弹出的对话框中选择"检查"选项;随后,在页面展示的具体内容部分进行操作。
提示:代码显示的方法取决于浏览器类型,在部分情况下(如360浏览器等),用户可能无法直接查看原始代码内容。
步骤图:
1)首页,获取A~Z的页面链接
2)名字链接页,获取每个字母中的名字链接(存在翻页情况)
3)名字内容页,获取每个名字的评论信息
2、编写测试代码
在获取网页信息的过程中,在此过程中采用自动化的方式建立所有字母间的联系,并将这些联系存储在一个二维数组中
1 defget_url1():2 urls=[]3 #A,'B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
4 a=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
#自动生成A至Z的链接
for each item in a:
构建一个包含所有 URL 的列表 urls.
使用 pd.DataFrame 将 urls 转换为 DataFrame 命名为 dp.
dp = pd.DataFrame(urls)
dp.to_csv("A至Z链接列表.csv", mode="append", encoding='utf-8-sig')
循环嵌套用于遍历每个字母链接,并调用获取对应页面的函数;具体实现为:嵌套循环结构:外层循环遍历urls列表中的每个元素j;内层调用get_pages_Html(j)函数以获取对应页面的内容;将处理结果返回给外层调用处。
提取名称链接;通过分析网页源码确定包含名称的标签;开发代码;采用直接存储的方式存储这些名称;便于后续对名称进行评论内容的获取。
1 #获取页数
def get_pages_Html(url1):
req = requests.get(url1)
soup = BeautifulSoup(req.text, "html.parser")
# 异常处理 用于解决页面不存在多页问题 使用正则表达式提取页面数量
6 begin:7 last page的位置信息来自...['href']的位置。
8 str1=将last page转换为字符串并存储在变量中。
9 b=通过查找所有正整数字符来解析str1中的内容。
10 for each page inb:
11 num=取出当前页码值。
12 except:处理异常情况
13 num=设置为默认值
14 get_pages(num,url1)15 returnnum16
该函数用于从指定URL获取指定数量页码的数据,默认从第一页开始收集数据直到指定页数上限。
首先创建一个空列表变量pages用于存储爬取的数据。
然后通过循环遍历k从范围生成的数据,
在每次循环中将URL拼接页码参数添加到pages列表中。
最后利用pandas库将收集到的dataframe对象导出为逗号分隔值格式文件,
并以追加的方式保存在NUM_pages_1.csv文件中。
#函数调用
24 for l inpages:25 parse_HTML2(l)26 returnpages27
28
29 #名字的链接,根据网页源码的标签,确定名字链接的位置
该函数用于解析HTML内容并生成相应的数据框以存储错误信息。
31 try:
32 req = requests.get(url2)
33 req.encoding = req.apparent_encoding
34 soup = BeautifulSoup(req.text, "html.parser")
35 except:
36 dp = pd.DataFrame({url2: []})
37 dp.to_csv("Error_pages_1.csv", mode="a", encoding='utf-8-sig')
name_data_l = []
error = []
li_list = soup.find_all('li', class_="Listing-name pt-15 pb-15 bdb-gray-light w-100pct flex border-highlight")
try:
for li in li_list:
nameList = li.find('a', class_='flex-1')['href']
name_data_l.append(f"https://nameberry.com/{nameList}")
time.sleep(1)
cun(name_data_l, "Name_List_1")
except:
dp = pd.DataFrame({name_data_l: []})
dp.to_csv("Error_Name_List_1.csv", mode="a", encoding='utf-8-sig')
# cun(url2, "Error_link_Q")
51 #dp=pd.DataFrame(name_data_l)
52 #dp.to_csv("Name_List.csv",mode="a",encoding='utf_8_sig')
53 #for i in name_data_l:
54 #parse_HTML3(i)
55 returnname_data_l56
3)获取名字评论的内容,采用字典形式写入文件
1 #名字里的内容
defparse_HTML3(url3):
count=0
req=requests.get(url3)
req.encoding=req.apparent_encoding
soup=BeautifulSoup(req.text)
error=[]
try:
Name=soup.find('h1',class_='first-header').find("a").get_text().replace(",","").replace("\n","")
except Exception as e:
error.append(url3)
cun(error,"Error Link Comment")
li_list=soup.find_all('div',class_='comment')
for li in li_list:
Title=li.find('h4').get_text().replace(",","").replace("\n","")
Time=li.find('p',class_='meta').get_text().replace(",","").replace("\n","")
Comments=li.find('div',class_='comment-text').get_text().replace(",","").replace("\n","")
dic2={
"Name":Name,
"Title":Title,
"Time":Time,
"Comments":Comments
}
time.sleep(1)
count=count+1
26 save_to_csv(dic2,"Name_data_comment")27 print(count)28 return 1
3、测试代码
在代码完成之后,在进行后续操作时需明确具体步骤:首先按照顺序执行功能模块间的交互;其次,在获取链接的过程中采用嵌套的方式处理;接着,在处理具体内容时应确保数据完整性;此外,在提取文件中的名字链接时需注意路径结构;最后,在处理名字的评论内容时应避免重复计算以提高效率
如图:
2)测试结果
4、小结
在执行网页内容抓取任务时,请先对目标页面的原始代码进行分析,并完成编码与调试工作。同时必须遵守网站提供的爬虫协议(如有违反规定将导致账号受限)。当需要处理大量数据时,请考虑将数据获取过程划分为多个阶段性的请求(以便分阶段完成整个数据获取的任务)。
总之,爬虫有风险,测试需谨慎!!!
