纯小白Python爬取东方财富网研报内容并通过机器学习的SVM模型进行文本分析(一)

    xiaoxiao2025-01-15  18

    首先,了解爬虫基本概念,爬虫其实就是程序假装自己是用户在网络上进行数据的搜集,其本质是模拟用户。下面对爬虫的基础进行一些介绍。

    1.互联网http协议中,客户端(我)请求服务端(网页)有以下几种请求: ①get 请求 优点:便捷 缺点:不安全;明文;参数的长度有限制(在浏览器网址上直接输入的那种) ②post 请求 优点:比较安全;数据整体没有限制;上传文件 ③put 请求 上传信息不完全,具体我还没有遇到 ④delete 删除信息的请求

    2.作为个人,发送网络请求,需要带一定的数据给服务器,让服务器识别你(不带数据也可以,但是情况特殊,一般人很少遇见,我暂时还不太了解) 以下这些都在右键点击审查\检查元素 然后点击Network可以看到

    request header–请求; response header–响应; Accept:文本的格式 Accept-Encoding:编码格式 Connecttion:长连接 短连接 Cookie:需要登陆的时候,才使用这个。举个例子,一个人登陆它的淘宝账号需要输入密码,如果你知道了他的cookie,你就可以上他的账号 Host:域名 Referer:标志着从哪个页面跳转过来的 User-Agent:浏览器和用户的信息

    3.爬虫模拟个人的工作原理(承接上面两点)

    ①确认抓取的url(网址)是什么 ②使用Python代码发送请求获取数据(有可能是二进制 巴拉巴拉) ③解析获取到的数据(精确数据) ④找到新的目标(url)回到第一步(循环爬取:翻页等) ⑤数据输出为txt excel等格式或者保存进数据库中

    4.下面进行一点简单的爬取(注意,下面全程围绕要有爬取的网站和传给网页的一些参数请求来进行爬取) 先介绍一下Python自带的基本库,主要是为了了解原理用,真正爬取的时候几乎不会用到这个。基本内容如下:(4-7都是这方面的内容,主要是了解原理更深入理解一下,并且面试可能会用) 以上代码输出的内容是html源代码 补充三点 ①当url中有汉字时,需要进行转义,原因在于ASCII码中没有汉字,urlopen的时候是无法识别的此时采用urllib.parse.quote(url,safe=string.printable)进行转义即可。ASCII码和上面代码的后半段decode encode涉及到一些编码内容,我将在系列(三)中进行详细讲解。

    ②www.baidu.com本质是一个IP地址,只不过经过了装饰成为了易读的baidu

    ③当你获取源代码的时候,可能无法获取的一个原因是网址是https,https是对http的一种加密协议,具体了解推荐《Python网络编程基础》这本书,这个阶段只要知道将s去掉可以解决这个问题即可。

    5.深层次访问

    刚才我们只是了解了简单的获取html的源代码,并不能帮助我们进行页面的访问,下面我们进行更加深层次的访问。.我们需要获取到网页的Headers,也就是我们访问网站时候应该给予网站的数据,爬虫需要这个,我们用urllib.request.Request(url)来传输这些东西并且获取到url内容。 关于urllib.request.urlopen和urllib.request.Request的区别参考 https://blog.csdn.net/qq_39288751/article/details/83685427 解释的很清晰 当然,如果不在一开始就赋予headers的值,可以动态添加 下面是两种方法的示例:

    header = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", } #第一种方式,创建请求对象,添加响应头信息 #request=urllib.request.Request(url,headers=header) #第二种方式动态的添加header信息 #两种方式都要掌握 request = urllib.request.Request(url) request.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36")

    刚才是添加请求头信息 下面的代码是获得请求头的两种方式 在这里解释一下为什么有的时候要动态添加请求头,因为为了防止服务器发现我们一瞬间访问太多次,我们可以使用不同的User-Agent(即不同的浏览器)去访问。即Headers中放一个用户池,每次都选不同的去访问

    6.代理IP和处理器

    紧随上文,即使我们每次采用不同的浏览器,但是我们的IP是一样的,同样为了防止因为IP被反爬,我们需要添加代理池,代理池需要代理器,我们先讲代理器的构建 注意,其实urllib.request.Request直接把代理器弄好了,我们此时是在讲内部原理。 ①hande→opener→opener.open,效果和urlopen是一样的 ②代理IP池 A.免费: B.付费: 第一种方式:

    第二种方式: 7.Cookie

    """ 获取个人中心的页面 1.代码登录 登录成功 自动获取cookie 2.自动带着cookie 去请求个人中心 cookiejar 自动保存cookie(不用再永get.header提取出来再重新添加了) """ import urllib.request from http import cookiejar from urllib import parse #登陆之前的 登录页的网址https://www.yaozh.com/lojin #找登录参数 #后台 根据你发送的请求方式来判断,如果你是get返回登录页面,如果是Post返回登录结果 #1.代码登录 #1.1登录的网址 login_url = "https://www.yaozh.com/login" #1.2登录的参数;key不能错 login_form_data = { "username":"15630351653", "pwd":"91ve1fmj", #下面这两个,有可能两个都需要的时候才能访问,有可能有一个就能访问,需要挨个可能性来测试得出 "formhash":"11DE8EAA15", "backurl":"https//www.yaozh.com" } #参数需要转译;#post请求的data要求是bytes login_str = parse.urlencode(login_form_data).encode("utf-8") #1.3发送登录请求:需要处理器,请求的网址,请求头,携带的数据 #1.3.1(1)定义有添加cookie功能的处理器 cook_jar = cookiejar.CookieJar() cook_handler = urllib.request.HTTPCookieProcessor(cook_jar) #1.3.1(2)根据处理器生成opener opener = urllib.request.build_opener(cook_handler) #1.3.2 添加请求头 headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" } #1.3.3 带着网址,请求头,携带的数据发送post请求 login_request = urllib.request.Request(login_url,headers=headers,data=login_str) #如果登录成功,cookjar自动保存cookie opener.open(login_request) #2.代码带着cookie去访问个人中心 center_url = "https://www.yaozh.com/member/" #下面这条不写也没啥事,但不写有可能被反爬虫反住,最好还是写Q!!!!!!写了的具体作用是啥呐? center_request = urllib.request.Request(center_url,headers = headers) response = opener.open(center_url) #bytes→str data = response.read().decode() with open("02cook.html","w",encoding="utf-8") as f: f.write(data) #一个用户 在不同的地点(IP(福建,上海,河南))不同浏览器上面不停的登陆,很明显被察觉出是非人在操作 #1.会封你的账号2.会出现验证码 #所以需要N个账号 众多IP 众多浏览器 ,账号不用太多:因为需要钱,IP和浏览器可以很多 #上述代码整体思路: ①先建立一个可以保存cookied的opener ②将需要登陆的网址给予Request一些参数,把访问网址的内容反馈给login_request对象 ③用opener打开这个对象,打开成功的话,就是登陆成功了,并且在opener中保存了cookie ④将密码登录后的那个网址给Request一些参数,反馈给对象center_request,用opener打开这个对象,就可以了,因为参数和cookie都有,所以就直接登录成功了。

    上面这些都是urllib.request库中添加代理 添加cookie的方法,这些都是原理性的东西,我们一般在爬取数据的时候,不采用这些方法,想必你也看到这些是很繁琐的。下面我们引入requests库进行讲解。requests是爬取静态页面常用的库。

    8.requests库对上述内容的实现 https://blog.csdn.net/weixin_42134789/article/details/82904741 都在这个网站里了,很详细,希望你在之后的使用中忘记urllib的繁琐,但是面试的时候可能会问到你这些原理,平时是不需要掌握的

    最新回复(0)