信息提取是爬虫项目中极为重要的一步,在接收到请求信息后,得到的往往是整个网页页面的信息,可以通过PyQuery、Beautifulsoup、xPath等第三方库结构化网页提取相关内容,但是随着前后端技术的不断发展,我们需要的信息更多可能是以json格式返回的,这时就需要正则表达式来提取信息,但是正则表达式是一套完整的语言规范,尤其对初学者特别不友好。对这部分感兴趣的可以读一下我之前的文章《哇~正则表达式真香》,本文我将介绍一种极简方法,用正则表达式四个字符“(.*?)”来提取信息的方法。
这里我以爬取大众点评武汉街舞相关店铺信息【店名、地址、电话信息】为例,进行演示:
import requests
import json
import re
import pandas as pd
import os
import time
import random
BASE_URL = "https://www.dianping.com/search/keyword/160/0_%E8%A1%97%E8%88%9E/p"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',
'Cookie':'_lxsdk_cuid=17f540a0d49c8-0a36f3f6ab440f-978183a-144000-17f540a0d49c8; _lxsdk=17f540a0d49c8-0a36f3f6ab440f-978183a-144000-17f540a0d49c8; _hc.v=f24f226e-2247-f10c-55fb-e09cba145754.1655347958; Hm_lvt_602b80cf8079ae6591966cc70a3940e7=1655347959; s_ViewType=10; WEBDFPID=0ux516uv9u5v5735y2z6v23zu68464648183z266yw0979584897u068-1655434746217-1655348344154IKQSGWOfd79fef3d01d5e9aadc18ccd4d0c95077713; dper=8baf569b6bb6de39144553d1ec95cd2df854f1d84afcd0d78fd465b78bdd494c0c36882ee18f61d90791b25325267ee4be3b8008c90a4a2f4eaf6bc2018285e1; fspop=test; ll=7fd06e815b796be3df069dec7836c3df; cy=3; cye=hangzhou; Hm_lpvt_602b80cf8079ae6591966cc70a3940e7=1655350213; _lxsdk_s=1816a6d508c-4fc-513-306%7C%7C171'
}
page_url = BASE_URL+str(1)
page_res = requests.get(page_url,headers=headers)
page_res_text = page_res.text得到的首页结果为:
对于首页内容需要得到店铺详情页的url具体在href中,店铺名信息在h4标签中,所以可以构建正则表达式得到需要的信息,首先复制包含href内容的一段完整信息,一般是两个href中间的完整内容或者一直在重复的内容,这里复制了一段一直在重复的完整信息:
title="DOC街舞(正弘城店)" target="_blank" href="https://www.dianping.com/shop/H2HTE3lnWffdMcAb" >
DOC街舞(正弘城店)
<然后选择开头和结尾以及中间的标志性信息,这里开头选择title,结尾选择,以及中间标志选择target,进行保留其余内容用.*?代替,需要的url信息和店铺名信息用(.*?)构造正则,这样就能获取所有的详情页url信息,具体:
pattern_page = 'title=.*? target.*? href="(.*?)" >
(.*?)
' #'title=.*? target=.*? href=(.*?) >
(.*?)
'
pattern_page = re.compile(pattern_page)
shops_list = re.findall(pattern_page,page_res_text)这样就得到第一个页面中所有的店铺名称和详情页的url了
与浏览器访问得到的结果完全一样
利用这个方法同样对店铺详情页中店铺地址和电话构造正则进行信息提取
完整代码如下:
提取每一页中的店铺详情页url和店铺名
爬取店铺详情页获得店铺地址和电话信息
最后得到的结果:
结论:
利用四个字符进行信息提取,可以分为以下几步:
1、复制信息所在的一段内容【通常是重复内容或者两个信息之间的一整段】
2、选择开始标志、结束标志、中间标志以及信息标示保留
3、无用信息用.*?代替,需要提取的信息用(.*?)代替,构建正则并用re.compile()进行编译
4、用re.findall()进行信息提取
创作不易,欢迎点赞、关注、在看
抱团学习,一起AI
| 留言与评论(共有 0 条评论) “” |