博客第二天
测试页面:TripAdvisor:https://www.tripadvisor.cn/Attractions-g60763-Activities-New_York_City_New_York.html#FILTERED_LIST,
目的:爬取第一区类的title,img,cate,
工程内容:Python3.5,jupyter notebook
工具包:requests, BeautifulSoup,time,pandas
代码(30页):
import time
from bs4 import BeautifulSoup as bsimport requests
import pandas as pd
url = 'https://www.tripadvisor.cn/Attractions-g60763-Activities-New_York_City_New_York.html' # 测试页面
urls = ['https://www.tripadvisor.cn/Attractions-g60763-Activities-oa{}-New_York_City_New_York.html#FILTERED_LIST'.format(str(i)) for i in range(0,930,30)] #爬虫所需页面
info = [] # 用于存储信息
def get_pages(url,data=None): #定义函数抽取元素
time.sleep(2)
web = requests.get(url)
soup = bs(web.text,'lxml')
titles = soup.select('div.listing_title > a[target="_blank"]') #注:对于非纯Python语句,注意不能多空格、单双引号等区别
imgs = soup.select('img[width="180"]')
cates = soup.select('div.p13n_reasoning_v2')
for title,img,cate in zip(titles,imgs,cates):
data = {
'img' : img.get('src'),
'title' : title.get_text(),
'cate' : list(cate.stripped_strings),
}
info.append(data)
# print(data) #用于测试
# print(urls) #用于测试
for single in urls: #调用函数
get_pages(single)
df = pd.DataFrame(info)
df.to_csv('14练习结果.csv') #输出到文件
print结果(部分):
csv截图(部分):
内容:爬取了1-30页,共731条数据(注:这个数字显非常随机,原因是此次代码只抓取了页面中非聚合的对象,而此类对象在每页中的出现是不规律的,另外,也不排除后面的页面编排规则有些许改变,此处没有花时间做仔细校对),图中获取的img并非真实链接(末尾都是img2/x.gif,被加密保护了),时间有限,这个问题留到以后解决。
error :无
总结:
1. print及csv各项的顺序于data中设定的顺序不一样,此处疑问待解决
2. 手写的元素定位更加简洁,但是有时需要多加分析和测试才能准确定位元素
3. 涉及函数间调用时,切记函数名称不能写错
4. .stripped_string方法可以对对象进行切片,但是在Excel中显示效果不是很理想,此处代码应加以优化,或者对csv文件加以处理
5. 写代码时需要注意缩进问题,不符合规范的缩进方式会导致代码无法正常运行。
总结:
1. print及csv各项的顺序于data中设定的顺序不一样,此处疑问待解决
2. 与css selector类似的定位方法,十分简洁
3. 函数定义及使用,应仔细分析