学习python爬虫看一篇就足够了之爬取《太平洋汽车》论坛及点评实战爬虫大全

Gloria ·
更新时间:2024-09-21
· 602 次阅读

前言: 这也是一篇毕业论文的数据爬虫,我第一次看见《太平洋汽车》的点评信息时,检查它的网页元素,发现并没有像《汽车之家》那样的字体反爬技术,所有就初步判断它没有很强的反爬虫技术,大不了就使用selenium库自动化实现爬虫呗。但是我确因为这样一个网页写了6种爬虫手段,一直在与它的反爬虫技术对抗,虽然最后我完成了任务,但是感觉并不是很完美,和其他网站的爬虫相比起来,它的运行速度有点慢,也不敢快。就这样收手吧,通过它也学到了很多的知识,如果你也想学习爬虫,这篇文章可以帮你解决90%以上的网页,简单的梳理一下吧,希望对你的学习有所帮助!

文章目录1、最快的30行代码1.1、python库的基础介绍1.1.1、requests库1.1.2、time库1.1.3、浏览器代理1.1.4、re库1.1.5、替换 方法1.1.6、CSV库保存数据1.2、爬取网页数据保存思路及代码1.2.1、分析网页1.2.2、实现思路1.2.3、实现代码2、设置请求时间2.1、timeout方法2.2、eventlet库3、requests + IP代理3.1、如何使用IP代理3.2、如何获取 IP3.3、认识随机数3.4、IP 代理实现源码4、requests + cookie值4.1、cookie值得获取与转化4.2、使用cookie值请求服务器5、Selenium自动化爬取5.1、自动登录《太平洋汽车》4.2、传入URL爬取信息6、会话请求6.1、如何使用requests提交账号和密码6.2、源码汇总7、爬取“朗逸”论坛信息7.1、分析论坛首页7.2、爬取论坛首页论题链接7.2.1、如何定位xpath节点7.2.2、代码实现7.3、BeautifulSoup筛选信息7.4、把文本写入txt文件保存7.5、论坛源码汇总

结果下载: https://www.lanzous.com/i9ilkfi

1、最快的30行代码 1.1、python库的基础介绍 我这里一共使用了5个python的基础库,简单的来介绍一下它们 1.1.1、requests库

这个是一个请求服务器的库,用于向服务器发出请求,返回结果,如果请求的是网页的URL,返回的则是该网页的HTML,我们要爬取的文字就在其中,直接进行提取就行了。使用前需要进行安装,可以直接用cmd命令: pip install requests ,使用方法如下:

import requests html = requests.get('https://baidu.com').text print (html)

也可以在其中设置它的其他参数:

参数 作用
url 网页的URL
headers 浏览器参数,代理等,用于模拟浏览器发出请求
data 存放请求时提交的信息
timeout 链接服务器响应的时间,请求不到就结束
proxies IP代理

重点: 爬虫的目的就是在模拟浏览器向服务器发出请求拿到数据,如果服务器识别你的这个是爬虫程序,就会防止你获取数据,或者给你错误的信息,所以写爬虫是一定要模拟的像服务器一样,防止反爬虫。

1.1.2、time库 这个库主要用于记录时间和设置暂停的时间,之所以要暂停时间是怕访问频率过快被识别这是爬虫程序! import time startTime = time.time() #记录起始时间 time.sleep(3) # 暂停3秒钟 endTime = time.time()#获取结束时的时间 useTime = endTime-startTime #结束时间减开始时间等于使用时间 print ("该次所获的信息一共使用%s秒"%useTime)

结果:

该次所获的信息一共使用3.0004384517669678秒 1.1.3、浏览器代理

(1)自己浏览器的代理
浏览器代理可以使用自己浏览器的,以谷歌为例:打开网页,鼠标右击——> 检查——> Network——> All ——> headers——> user-agent
在这里插入图片描述
设置方式:

headers ={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36" }

(2)fake_useragent库
这个库可以随机生成浏览器代理,可以指定浏览器类型,也可以随机,如随机生成5个谷歌浏览器的 User-Agent :

from fake_useragent import UserAgent for i in range(5): headers = { "User-Agent" : UserAgent().chrome #chrome浏览器随机代理 } print (headers) {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36'} {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36'} {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36'} {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36'} {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36'} 1.1.4、re库

re也叫做正则表达式,可以用来匹配需要的内容,对于想快速使用它入门的同学,只需要会 .*? 就可以了,没有括号的 .*? 表示匹配掉,有括号的 (.*?) 表示匹配出来。匹配出网页中的内容,看一个简单的案例:
在这里插入图片描述
为了更方便查看结果,我复制了两次这个文本的源代码,并且改变了其中一个的class标签样式为 ayouleyang
在这里插入图片描述
匹配方法如下:

import re #假设一个字符串 str_text = """

阿优乐扬的博客

一种追求,一种标准,一种态度,一种精神;阿以至优,乐享于扬!

阿优乐扬的博客

一种追求,一种标准,一种态度,一种精神;阿以至优,乐享于扬!

""" r1 = re.compile('

(.*?)

') #只取到第一个,注意class="description " result1 = re.findall(r1, str_text) #在str_text中找到所有符号r1规则的信息 print ("result1 = ", result1) r2 = re.compile('

(.*?)

') #class中使用了通配符,匹配到两个 result2 = re.findall(r2, str_text) print ("result2 = ", result2)

结果:

result1 = ['一种追求,一种标准,一种态度,一种精神;阿以至优,乐享于扬!'] result2 = ['一种追求,一种标准,一种态度,一种精神;阿以至优,乐享于扬!', '一种追求,一种标准,一种态度,一种精神;阿以至优,乐享于扬!']

它的结果存放在数组之中,可以直接存放到CSV文件中,上面的方式如果有必要的话,可以先用

1.1.5、替换 方法

替换到字符串中可以造成干扰的换行符,制表符和空格,然后再进行匹配信息

str_text = str_text.replace('\r\n', '').replace('\t','').replace(' ','') 1.1.6、CSV库保存数据

这是一个以标点符号分隔数据的文件,默认为 , 分隔,分隔符号也可以自定义,通常不需要设置,使用默认的方法

import csv #创建CSV文件,并写入表头信息,并设置编码格式为“utf-8-sig”防止中文乱码 fp = open('./test_file.csv','a',newline='',encoding='utf-8-sig') #"./"表示当前文件夹,"a"表示添加 writer = csv.writer(fp) #方式为写入 writer.writerow(('序号','姓名','学号')) #表头 info = ['1', '阿优乐扬', '2017010807'] #内容为数组 writer.writerow((info)) fp.close() #关闭文件

在这里插入图片描述

1.2、爬取网页数据保存思路及代码 1.2.1、分析网页 在爬取一个网页时,我们必须要确定网页的信息,再选择爬取的方式,可以使用鼠标右击——> 检查 ——> 定位字体,查看是否加密等 分析链接,实现翻页爬取,如朗逸点评的前五个链接别为 https://price.pcauto.com.cn/comment/sg1633/ https://price.pcauto.com.cn/comment/sg1633/p2.html https://price.pcauto.com.cn/comment/sg1633/p3.html https://price.pcauto.com.cn/comment/sg1633/p4.html https://price.pcauto.com.cn/comment/sg1633/p5.html

从它的规律不难看出它的下一个链接,对于第一个链接,我们可以用其他链接的方式,为它加上 p1.html ,在浏览器中查看是否能正常访问,结果是可以的,接下来就可以批量生成链接了。

for page in range(1, 10): #简单生成9个试试,从0开始,不包括10 comment_url = 'https://price.pcauto.com.cn/comment/sg1633/p%s.html'%page print (comment_url)

结果:

https://price.pcauto.com.cn/comment/sg1633/p1.html https://price.pcauto.com.cn/comment/sg1633/p2.html https://price.pcauto.com.cn/comment/sg1633/p3.html https://price.pcauto.com.cn/comment/sg1633/p4.html https://price.pcauto.com.cn/comment/sg1633/p5.html https://price.pcauto.com.cn/comment/sg1633/p6.html https://price.pcauto.com.cn/comment/sg1633/p7.html https://price.pcauto.com.cn/comment/sg1633/p8.html https://price.pcauto.com.cn/comment/sg1633/p9.html 1.2.2、实现思路 导入所需要使用的库 获取开始的时间 设置浏览器代理 创建CSV文件并打开写入表头信息 设置需要爬取的页数循环产生其他链接 请求服务器得到HTML 替换掉HTML中的空格,换行,制表符等信息 正则匹配出内容 写入文件保存 关闭文件记录时间 结束 1.2.3、实现代码 # 1. 导入所需要使用的库 import requests import time import re import csv from fake_useragent import UserAgent startTime = time.time() #2.记录起始时间 headers = { "User-Agent" : UserAgent().chrome #3.chrome浏览器随机代理 } #4.创建CSV文件,并写入表头信息 fp = open('./太平洋汽车_速腾轿车.csv','a',newline='',encoding='utf-8-sig') writer = csv.writer(fp) writer.writerow(('车主','发表时间','购买车型','购买时间','地点','价格','价格单位','平均油耗', '油耗单位','行驶里程(公里)', '外观评分', '内饰评分', '空间评分', '配置评分', '动力评分', '操控评分', '油耗评分', '舒适评分', '外观', '内饰', '空间', '配置', '动力', '操控', '油耗', '舒适')) # 5. 设置需要爬取的页数循环产生其他链接 for page in range(1, 789):# 1, 789 comment_url = 'https://price.pcauto.com.cn/comment/sg1633/p%s.html'%page #6.请求服务器得到HTML response = requests.get(url=comment_url, headers=headers).text #7. 替换掉HTML中的空格,换行,制表符等信息 res_replace = response.replace('\r\n', '').replace('\t','').replace(' ','') # 8. 正则匹配出内容 r = re.compile('(.*?)(.*?)发表.*?target="_blank">(.*?)<.*?购买时间(.*?)
.*?购买地点(.*?)
.*?裸车价格(.*?)(.*?)
.*?平均油耗(.*?)(.*?)
.*?行驶里程(.*?)公里
.*?