Hello,大家好,我是Vince。 因为我平时会买书学习,所以好奇想抓取下网站的图书信息。 今天主要分享是抓取当当网的图书信息。 下面直接进入实战环节。 相关包及环境准备
3.pycharm环境(pycharm2020.01.05)及python3.7.4 1.网页分析 常规抓包按F12选择网页,然后刷新网页,这里选择第2页,可以发现,响应的信息在网页中,也没有经过加密处理。 再看下标头信息是否有加密的情况。 可以看出请求方式是get,仔细观察请求网址,可以发现page_index=2应该是网页刷新的变化规律,后面可以构造url,循环多页获取信息。下面的请求标头也没有出现加密的情况。接下来可以模拟发送请求。 2.发送请求 分析完网页规律后,是get方法,直接用requests发送请求,带上请求头相关信息。代码如下 def send_requests(url): # 请求头 'Cookie': '__permanent_id=20230311143338916154826977894564000; ddscreen=2; pos_0_end=1678608524994; dest_area=country_id%3D9000%26province_id%3D111%26city_id%3D0%26district_id%3D0%26town_id%3D0; pos_1_end=1678619513754; pos_1_start=1678619536498; pos_9_end=1678619554530; ad_ids=31898396%2C14129493%2C6624974%2C5066933%7C%233%2C3%2C2%2C2; search_passback=bb7501071372a24b00b30d64f0010000602fca0000b30d64; __rpm=%7Cs_112100.155956512835%2C155956512836..1678624653681; __visit_id=20230312203733742309228923821562348; __out_refer=; __trace_id=20230312203733743429170795570296542', 'Referer': 'http://search.dangdang.com/?key=python%BB%FA%C6%F7%D1%A7%CF%B0&act=input', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', } try: response = requests.get(url=url, headers=headers) if response.status_code == 200: result = response.text # print(result) return result except Exception as e: print(e.args) 这里加了try...except捕获异常信息,状态码是否ok,返回200。 打印结果可以发现网页是ok的,可以看到加载的网页信息 3.正则表达式提取信息 下面用正则表达式提取信息。 比如想要提取网页中所有标题信息,这里用到是re的findalll来匹配所有信息,用的是非贪婪匹配(.*?),意思是在网页中尽可能匹配少的信息,达到精准匹配的效果。然后从网页中可以发现标题信息有两个,一个是title='',一个是alt=''。 通过测试发现alt=''会更加精准把标题信息匹配出来。把要匹配的信息用()括出来。再比如要匹配价格信息,可以看到价格信息,可以看到价格信息在节点class='search_now_price'后面。为了更加精准匹配,需要带上这个class节点。 发现价格不是纯数字,有字母和标点符号,这是一个小坑,后期需要做清洗。 当然也可以用re精准匹配里面的小数。而不是(.*?)非贪婪匹配了。这里我用的非贪婪匹配,后期再做清洗处理。 其他信息re正则表达式匹配比较类似,需要观察节点,然后也是用非贪婪匹配比较方便。核心代码如下 # 获取信息 这里同样用了try...except来捕捉异常信息,有些信息有空的情况,可以让程序继续执行。 4.保存信息 保存信息用的是pandas,保存在csv表格中。代码如下: def save_info(data): columns = ['标题','价格','作者','出版日期','出版社','书籍介绍','店铺名'] df = pd.DataFrame(data,columns=columns) df.to_csv('当当网图书信息.csv',encoding='utf-8') 然后运行主程序, 核心代码如下: if __name__=='__main__': 5.运行结果 总共用了3分钟左右的时间,总共抓取10000多条信息,速度还可以。 最后做下简单的数据清洗和可视化 这里用到的是Anaconda数据科学平台中的jupyter notebook环境。 下载链接:https://www./products/distribution 可以下载个人版本玩玩。 首先导入相关包 加载数据并查看前5行数据 查看数据类型 可以发现总共10483条数据,书籍介绍只有694条,说明很多信息是空值。价格是字符串类型需要做清洗转换为float类型,出版日期是字符串类型,需要做清洗转化为时间类型数据。 价格字段清洗 价格字段中有字母和标点符号,需要把它替换掉,这里用replace替换 出版日期字段清洗 出版日期有个斜杠符号,需要把它清洗掉。 出版日期趋势分布: 从图表可以看出,python机器学习书籍从2016年开始,出版的数量在快速的上升,直到2022年进入平稳期,个人简单分析,16年刚好有个事件阿法狗打败某围棋冠军,人工智能开始受到关注,也就带动机器学习书籍的火热及出版。 价格分布情况: 价格主要在40到80元之间,占比一半左右。其次是80到120元之间。超过120元的占比比较少。 出版社数量分布: 可以看出,人民邮电出版社,清华大学出版社,机械工业出版社占比比较多。 平均价格Top20的出版社 平均价格Top20的店铺 以上是简单的数据清洗和可视化分析。 总结:
|
|