从去哪儿网上爬取旅游景点的相关信息。主要包括以下几个步骤:
导入所需的库:
BeautifulSoup
用于解析网页内容,pandas
用于处理数据,requests
用于发送网络请求,re
用于正则表达式匹配。定义函数
crawer_travel_url_content(url)
:根据给定的URL地址发送网络请求,获取网页内容并返回BeautifulSoup
对象。定义函数
removenone(mylist)
:移除列表中的空值。定义函数
regnum(s)
:从字符串中提取数值。定义函数
crawer_travel_attraction_url(url)
:根据给定的城市URL,获取该城市旅游景点的总数maxnum
。然后根据每页10条的规则,计算出需要爬取的页数page
。遍历每一页的URL,解析页面内容,并提取景点的各种信息。将提取的信息写入CSV文件中。定义景点信息的列名数组
clums
。创建CSV文件,并写入列名。
读取包含城市链接的CSV文件。
遍历城市链接列表,调用
crawer_travel_attraction_url(url)
函数进行爬取。
主要代码如下:
def crawer\_travel\_url\_content(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = requests.get(url, headers=headers)
content = req.text
bsObj = BeautifulSoup(content, 'lxml')
return bsObj
def removenone(mylist):#移除参数中空值的函数
while '' in mylist:
mylist.remove('')
return mylist
def regnum(s):#提取爬取到的字符串中的数值
mylist = re.findall(r'\[\\d+\\.\\d\]\*', s)
mylist = removenone(mylist)
return mylist
def crawer\_travel\_attraction\_url(url):
# 该城市最大景点数
maxnum = crawer\_travel\_url\_content(url + '-jingdian').find('p', {'class': 'nav\_result'}).find('span').text
# 提取数字
maxnum = int(''.join(\[x for x in maxnum if x.isdigit()\]))
print(maxnum)
url = url + '-jingdian-1-'
# 这里取top10景点 每页10条 page从1开始
page = math.ceil(maxnum/10)
if page>200:
page=200
else:
page = math.ceil(maxnum/10)
for i in range(1, page):
url1 = url + str(i)
bsObj = crawer\_travel\_url\_content(url1)
dw=bsObj.find\_all('div',class\_='ct')
dq=bsObj.find\_all('li', {'class': 'item pull'})
if len(dq)<3:
sheng=dq\[1\].find('a').text
city=dq\[1\].find('a').text
else:
sheng = dq\[1\].find('a').text
city = dq\[2\].find('a').text
for i in dw:
cat = \[\]
name=i.find('span',class\_='cn\_tit').text
wenzhang\_num=i.find('div',class\_="strategy\_sum").text
pls=i.find('div',class\_="comment\_sum").text
pf=regnum(i.find('span',class\_="cur\_star").get('style'))\[0\]
zhanbi=i.find('span',class\_='sum').text
jisnjir=i.find('div',class\_='desbox').text
cat.append(sheng)
cat.append(city)
cat.append(maxnum)
cat.append(name)
cat.append(wenzhang\_num)
cat.append(pls)
cat.append(pf)
cat.append(zhanbi)
cat.append(jisnjir)
print(sheng,city,name,wenzhang\_num,pls,pf,zhanbi,jisnjir)
with open('去哪儿网城市景点汇总1.csv', 'a', encoding='utf-8-sig', newline='') as f:
a = csv.writer(f)
a.writerow(cat)
f.close()
print(url1+'已采集完成')
return True
import csv
clums = \['省份', '城市','景点数','景点名','文章数','评论数','评分','占比','简介'\]
with open('去哪儿网城市景点汇总1.csv', 'w', encoding='utf-8-sig', newline='') as f:
a = csv.writer(f)
a.writerow(clums)
f.close()
df=pd.read\_csv('去哪儿网城市.csv',encoding='utf-8')
for i in df\['链接'\].tolist():
try:
crawer\_travel\_attraction\_url(i)
except:
pass
运行效果: