- 课程:《Python程序设计》
- 班级:
- 姓名:梁启贤
- 学号:20212125
- 实验教师:王志强
- 实验日期:2022年5月30日
- 必修/选修: 公选课
一.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
二. 实验过程及结果
(一) 实验分析与设计
这次实验本来也想做游戏,但是可能由于技术还不够,做了没到一半就已经报错了不下7,8次了。又是正好之前的课程刚好学了爬虫,最近又正想着买一双鞋,所以这次实验就想来爬一次淘宝,爬的是淘宝网里面的安踏店铺里的篮球鞋。下面是我所爬取网页的网址:
(二) 实现过程
爬虫:针对数据进行采集并下载到本地。采集互联网资源数据的一种工具,模拟刘浏览器发送请求执行操作。
首先,就要先在你要爬取的网站页面,获取数据,通过鼠标右键,点击检查,里面的网络模块,这是网络抓包的工具,在这个网页中所做的任何点击或者任何浏览网络的操作都会被它记录。
刷新网页之后,里面的数据会重新的加载,加载以后,就可以看到里面有各种的数据,包括图片以及一些文字内容。
通过搜索,我们可以输入关键字来在很多商品项里找到我们想要的那一个
在标头(Headers)模块里,这里有网页请求的详细信息、浏览器的版本号、用户等信息,在里面获取网站url,cookie,利用内置模块requests 爬取数据
1 import requests
2 import re
3 headers = {
4 'cookie': 'cna=qxGVGXDFZEwCAW8xEdkrNDKY; t=acc48bdd7e48e911b6151c4f193e341a; sgcookie=E100WaxaBNyoPGS4LqOrnl2pfgO%2BRkyB5QU%2BvB%2FlZGtzE6ELpeBXb4%2FquApstCKmlUKA7cWiprXrDzYC80XPnETxYGI83eXg6xezyAXgD4tzFqyTBuWg7FciTSp2Z5bhndOy; uc3=lg2=WqG3DMC9VAQiUQ%3D%3D&nk2=F5RCY8NF7ZpSzMk%3D&id2=UUpgRK0Dh99cfPLcTg%3D%3D&vt3=F8dCvC%2B4YvGbuIFI6Nw%3D; lgc=tb762491931; uc4=nk4=0%40FY4JjT4T55YXPRtaGUlZzqQgrc5uZA%3D%3D&id4=0%40U2gqy1weo0%2BYoUDtFVX%2BHVMras%2BVjy17; tracknick=tb762491931; _cc_=VFC%2FuZ9ajQ%3D%3D; enc=97oP%2BE%2BA%2Bs1nhEX3NfpsqwCxR4dU7yhhgej6nPqonoCvDbxugSOd7dhtF%2B6MxRqaV0DVPHP3jACjHM%2FLp6haEyolpPMvvvjcqo6yWaXXbAo%3D; mt=ci=-1_0; thw=cn; _m_h5_tk=a3565da47aac13523f6fc4487a4418de_1653488861152; _m_h5_tk_enc=591cde9fb32c2e4310a54bd6e10f6523; xlly_s=1; JSESSIONID=F362AAB152E0869F20692560C978B652; tfstk=cRLRBKZhCxDl0ZCv_3nc870PjIlcZEFRK76LJett9ZyYktadi1YMWG6ZV6WNejC..; l=eBQh7VduLXnA9fhQBOfZlurza77tSIRvHuPzaNbMiOCPO75p5XNdW6XSz-L9CnGVh6R2R3rk8yhpBeYBqIv4n5U62j-la6kmn; isg=BJOTx_nR9S9y0bloGvLxn458Ihe9SCcK-0Uw1UWw5rLoxLNmzRosWhQW-jSqrn8C',
5 'referer': 'https://s.taobao.com/search?q=%E5%AE%89%E8%B8%8F&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20220531&ie=utf8&cps=yes&cat=50468016',
6 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Microsoft Edge";v="101"',
7 'sec-ch-ua-mobile': '?0',
8 'sec-ch-ua-platform': '"Windows"',
9 'sec-fetch-dest': 'document',
10 'sec-fetch-mode': 'navigate',
11 'sec-fetch-site': 'same-origin',
12 'sec-fetch-user': '?1',
13 'upgrade-insecure-requests': '1',
14 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53',
15 }
16 url = f'https://s.taobao.com/search?ie=utf8&initiative_id=staobaoz_20220531&stats_click=search_radio_all%3A1&js=1&imgfile=&q=%E5%AE%89%E8%B8%8F%E7%AF%AE%E7%90%83%E9%9E%8B&suggest=0_4&_input_charset=utf-8&wq=%E5%AE%89%E8%B8%8F&suggest_query=%E5%AE%89%E8%B8%8F&source=suggest=132'
在这一步的时候,把headers里面的内容复制粘贴出来之后,出现了格式错误,如下图
解决方法:按住Ctrl + R,框选headers内容进行批量替换,批量替换之后就好了。
这里想要拓展一下:
.*? 表示匹配任意字符到下一个符合条件的字符
例子:正则表达式a.*?xxx 可以匹配 abxxx axxxxx abbbbbxxx
扩展:
* 匹配0或多个正好在它之前的那个字符。例如正则表达式。*意味着能够匹配任意数量的任何字符。? 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。.*是指任何字符0个或多个,.?是指任何字符0个或1个.
.* 具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。.*?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。
.?表示非贪婪模式,即为匹配最近字符 如果不加?就是贪婪模式a.*bc 可以匹配 abcbcbc
1 response = requests.get(url=url,headers=headers)
2
3 html_data = response.text
然后解析数据(需要商品信息 获取出来)
json_str = re.findall('g_page_config = (.*);', html_data)[0]
在这里先将json_str输出一下,然后把输出结果复制到json在线解析
json_dict = json.loads(json_str)
auctions = json_dict['mods']['itemlist']['data']['auctions']
for auction in auctions:
raw_title = auction['raw_title']
pic_url = auction['pic_url']
detail_url = auction['detail_url']
view_price = auction['view_price']
item_loc = auction['item_loc']
view_sales = auction['view_sales']
nick = auction['nick']
print(raw_title, pic_url,detail_url,view_price,item_loc,view_sales, nick)
最后是保存数据
1 with open('淘宝.csv', mode='a', newline='', encoding='utf-8')as f:
2 csv_writer = csv.writer(f)
3 csv_writer.writerow([raw_title, pic_url, detail_url, view_price, item_loc, view_sales, nick])
并生成了表格
以上就是网页第一页里的商品数据,点击运行后可以看到,爬取成功。而如果想要爬取很多页的商品数据,那么就需要加个循环
for page in range(0,11):
然后在网络模块里,查看每一页的负载(payload)里的s:参数,发现都是44的整数倍:
所以需要在url中网址的最后把132改为{44 * page}
下面是完整代码
import requests # 第三方模块
import re
import json
import csv
headers = {
'cookie': 'cna=qxGVGXDFZEwCAW8xEdkrNDKY; t=acc48bdd7e48e911b6151c4f193e341a; sgcookie=E100WaxaBNyoPGS4LqOrnl2pfgO%2BRkyB5QU%2BvB%2FlZGtzE6ELpeBXb4%2FquApstCKmlUKA7cWiprXrDzYC80XPnETxYGI83eXg6xezyAXgD4tzFqyTBuWg7FciTSp2Z5bhndOy; uc3=lg2=WqG3DMC9VAQiUQ%3D%3D&nk2=F5RCY8NF7ZpSzMk%3D&id2=UUpgRK0Dh99cfPLcTg%3D%3D&vt3=F8dCvC%2B4YvGbuIFI6Nw%3D; lgc=tb762491931; uc4=nk4=0%40FY4JjT4T55YXPRtaGUlZzqQgrc5uZA%3D%3D&id4=0%40U2gqy1weo0%2BYoUDtFVX%2BHVMras%2BVjy17; tracknick=tb762491931; _cc_=VFC%2FuZ9ajQ%3D%3D; enc=97oP%2BE%2BA%2Bs1nhEX3NfpsqwCxR4dU7yhhgej6nPqonoCvDbxugSOd7dhtF%2B6MxRqaV0DVPHP3jACjHM%2FLp6haEyolpPMvvvjcqo6yWaXXbAo%3D; mt=ci=-1_0; thw=cn; _m_h5_tk=a3565da47aac13523f6fc4487a4418de_1653488861152; _m_h5_tk_enc=591cde9fb32c2e4310a54bd6e10f6523; xlly_s=1; JSESSIONID=F362AAB152E0869F20692560C978B652; tfstk=cRLRBKZhCxDl0ZCv_3nc870PjIlcZEFRK76LJett9ZyYktadi1YMWG6ZV6WNejC..; l=eBQh7VduLXnA9fhQBOfZlurza77tSIRvHuPzaNbMiOCPO75p5XNdW6XSz-L9CnGVh6R2R3rk8yhpBeYBqIv4n5U62j-la6kmn; isg=BJOTx_nR9S9y0bloGvLxn458Ihe9SCcK-0Uw1UWw5rLoxLNmzRosWhQW-jSqrn8C',
'referer': 'https://s.taobao.com/search?q=%E5%AE%89%E8%B8%8F&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20220531&ie=utf8&cps=yes&cat=50468016',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Microsoft Edge";v="101"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53',
}
for page in range(0,11):
url = f'https://s.taobao.com/search?ie=utf8&initiative_id=staobaoz_20220531&stats_click=search_radio_all%3A1&js=1&imgfile=&q=%E5%AE%89%E8%B8%8F%E7%AF%AE%E7%90%83%E9%9E%8B&suggest=0_4&_input_charset=utf-8&wq=%E5%AE%89%E8%B8%8F&suggest_query=%E5%AE%89%E8%B8%8F&source=suggest={44 * page}'
response = requests.get(url=url,headers=headers)
html_data = response.text
json_str = re.findall('g_page_config = (.*);', html_data)[0]
json_dict = json.loads(json_str)
auctions = json_dict['mods']['itemlist']['data']['auctions']
for auction in auctions:
raw_title = auction['raw_title']
pic_url = auction['pic_url']
detail_url = auction['detail_url']
view_price = auction['view_price']
item_loc = auction['item_loc']
view_sales = auction['view_sales']
nick = auction['nick']
print(raw_title, pic_url,detail_url,view_price,item_loc,view_sales, nick)
with open('淘宝.csv', mode='a', newline='', encoding='utf-8')as f:
csv_writer = csv.writer(f)
csv_writer.writerow([raw_title, pic_url, detail_url, view_price, item_loc, view_sales, nick])
(三)最后的输出结果为
(四) 将代码上传到华为云上
1、打开WinSCP,并将写好的代码和表格移到云服务器中
2、打开putty,登录华为为云服务器,并将环境设置好
然后是运行结果
四、结课总结
为期12个周的python课程就这么告一段落了,我仍有种意犹未尽的感觉。通过对python这门语言的学习,不仅能够提升自己的编程水平,更重要的是可以培养我们解决问题的能力。对于提高我们的思维、逻辑等方面,都有很大程度上的帮助。
通过这几个星期的短暂学习,我收获良多。首先,初识了python,了解了python的发展历程、未来前景和优势 。接着在学习了输入输出后,我们学习了基本数据类型:整数类型,四种进制表示形式、浮点类型,字符串类型,单引号,双引号,正向递增序号、反向递减序号,索引和切片[ : ],字符串的操作符,字符串处理函数,字符串处理”方法”字符串类型格式化等等。接着我们学习了python的分支语句(分支结构)if elif else 和循环语句(循环结构)while for continue break,然后我们又学习了集合与字典,集合间的运算。之后我们学习了函数,def return 初步体会了代码复用和封装的感觉。之后我们了解了正则表达式、网络爬虫、Socket编程、Python操作数据库等等。
之前在网上看过,c和python的区别:C虽然同为高级语言,C本身是面向通用编程的一门语言,它设计之初就是为专业程序员量身定做的。从用途上其实就能看出来,除了我们熟悉的应用程序以外,驱动、单片机等其实都可以用C来做。因此在学C的时候,一开始就要懂得计算机的一些基本架构,比如那个经典的问题:int类型占几个字节。其实这就隐含了一些别的知识储备。简单来说就是你需要比较系统地理解计算机系统中的数据和运算究竟是怎么一回事。最最起码你得懂得你的程序是如何在内存中存、取数据,从而使得整个程序能够稳定运行的。再说得简单一点,如果要从C往上走,那么知识和技能就要相对系统。
而Python从一开始就是为了好用而设计的。那么这样就必须给编程人员减轻负担,它自己会帮你解决一大堆的问题。比如内存的管理等。这样一来,Python的用户其实就可以把更多的精力放在如何实现自己的业务需求上,而不用考虑过多计算机程序本身的东西。
我觉得,python和C相比,最大的一个点就是——方便、便捷。定义一个量不需要像C语言那样写上变量类型,而是只要写等号就行了。而且print等函数,不需要输入引号,分号那些麻烦的符号,体验感更佳。并且python的功能十分强大,是C语言所无法比较的。
经过12周的学习,我感觉虽然有的内容老师在课上讲过,但现在还是不能够很好的理解,不明白的地方还有非常多,因此我会在之后的时间里,继续学习python,不断努力、进步,最终能够熟练的掌握这门语言。
意见与建议:
我希望以后的Python课都能选一个大一点的教室上课,在515上课可能经常会遇到充电插口不够的地方,导致电脑没电,只能看着老师写代码却不能自己写。而在801上课的时候,充电口就很充足,上课会很安心。还有就是希望老师能够在讲相对难一点的内容的时候能够放慢节奏,在上课的时候,光是跟着敲代码都有些许吃力,更别说听懂看懂每一行代码的含义了。