python爬取豆瓣电影top250
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1、分析网页</li><li>2、请求服务器<ul><li>2.1导入包</li><li>2.2设置浏览器代理</li><li>2.3请求服务器格式</li><li>2.4请求服务器代码汇总</li></ul></li><li>3.xpath提取信息<ul><li>3.1获取xpath节点的方法</li><li>3.2xpath提取内容</li><li>3.2.1提取文本</li><li>3.2.2提取链接</li><li>3.2.3提取标签元素</li></ul></li><li>4.正则表达式<ul><li>4.1提取固定位置的信息</li><li>4.2匹配出数字</li></ul></li><li>5、提取一页中的所有信息</li><li>6、把内容写入文本csv</li><li>7、把所有代码汇总</li></ul></div><p></p><h1 id="1分析网页">1、分析网页</h1>
<p>当我们去爬取网页时,首先要做的就是先分析网页结构,然后就会发现相应的规律,如下所示:<br>
<img src="https://img-blog.csdnimg.cn/20200411210001664.png" alt="在这里插入图片描述" loading="lazy"><br>
生成链接:从网页链接的规律中可得写一个for循环即可生成它的链接,其中它的间隔为25,程序如下:</p>
<pre><code class="language-python">for page in range (0,226,25):
url ="https://movie.douban.com/top250?start=%s&filter="%page
print (url)
</code></pre>
<p>得到的结果如下:<br>
<img src="https://img-blog.csdnimg.cn/20200412131945685.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bm55QXJraW4=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" loading="lazy"></p>
<h1 id="2请求服务器">2、请求服务器</h1>
<p>在爬取网页之前,我们要向服务器发出请求</p>
<h2 id="21导入包">2.1导入包</h2>
<p>没有安装requests包的要先进行安装,步骤为:1.win+R运行——2.cmd回车——3.输入命令pip install requests</p>
<h2 id="22设置浏览器代理">2.2设置浏览器代理</h2>
<p><img src="https://img-blog.csdnimg.cn/20200412130424541.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bm55QXJraW4=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" loading="lazy"><br>
设置浏览器代理的代码如下:</p>
<pre><code class="language-python">headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
</code></pre>
<h2 id="23请求服务器格式">2.3请求服务器格式</h2>
<p>请求源代码,向服务器发出请求,如果在后面加上.text表示输出文本内容,代码如下图所示:</p>
<pre><code class="language-python">requests.get(url = test_url, headers = headers)
</code></pre>
<h2 id="24请求服务器代码汇总">2.4请求服务器代码汇总</h2>
<pre><code class="language-python">import requests
#pip安转 pip install requests————>win+r,运行————>cmd,回车,————>pip
test_url = 'https://movie.douban.com/top250?start=0&filter=' #''格式化,为字符串
#设置浏览器代理,它是一个字典
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#请求源代码,向服务器发出请求,200代表成功
reponse = requests.get(url = test_url, headers = headers).text
# 快捷键运行,Ctrl+Enter
</code></pre>
<h1 id="3xpath提取信息">3.xpath提取信息</h1>
<h2 id="31获取xpath节点的方法">3.1获取xpath节点的方法</h2>
<p><img src="https://img-blog.csdnimg.cn/20200412132136761.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bm55QXJraW4=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" loading="lazy"></p>
<h2 id="32xpath提取内容">3.2xpath提取内容</h2>
<pre><code class="language-python">from lxml import etree #导入解析库
html_etree = etree.HTML(reponse) # 看成一个筛子,树状
</code></pre>
<h2 id="321提取文本">3.2.1提取文本</h2>
<p>当我们在提取标签内的文本时,要在复制的xpath后面加上/text()<br>
如《霸王别姬》:</p>
<pre><code class="language-python"><span class="title">霸王别姬</span>
</code></pre>
<p>xpath为:</p>
<pre><code class="language-python">//*[@id="content"]/div/div/ol/li/div/div/div/a/span
</code></pre>
<p>提取文字:</p>
<pre><code class="language-python">name = html_etree.xpath('//*[@id="content"]/div/div/ol/li/div/div/div/a/span/text()')
print ("这是数组形式:",name)
print ("这是字符串形式:",name)
</code></pre>
<h2 id="322提取链接">3.2.2提取链接</h2>
<p>我们在提取链接时,需要在复制到的xpath后面加上/@href , 指定提取链接,</p>
<pre><code class="language-python">movie_url = html_etree.xpath('//*[@id="content"]/div/div/ol/li/div/div/div/a/@href')
print ("这是数组形式:",movie_url)
print ("这是字符串形式:",movie_url)
</code></pre>
<p>结果如下:<br>
<img src="https://img-blog.csdnimg.cn/20200412190827431.png" alt="在这里插入图片描述" loading="lazy"></p>
<h2 id="323提取标签元素">3.2.3提取标签元素</h2>
<p>提取标签元素和提取链接的方法一样,不过要在后面加上 /@class 就可以了,</p>
<pre><code class="language-python">rating = html_etree.xpath('//*[@id="content"]/div/div/ol/li/div/div/div/div/span/@class')
print ("这是数组形式:",rating)
print ("这是字符串形式:",rating)
</code></pre>
<p>结果如下:<br>
<img src="https://img-blog.csdnimg.cn/20200412191717455.png" alt="在这里插入图片描述" loading="lazy"></p>
<h1 id="4正则表达式">4.正则表达式</h1>
<h2 id="41提取固定位置的信息">4.1提取固定位置的信息</h2>
<p>正则表达式中用(.*?)来提取我们想要的信息,在使用正则表达式时,通常要先导入re这个包,举例如下:</p>
<pre><code class="language-python">import re
test = "我是js"
text = re.findall("我是.*?",test)
print (text)
</code></pre>
<p>结果如下:<br>
<img src="https://img-blog.csdnimg.cn/20200412182453826.png" alt="在这里插入图片描述" loading="lazy"></p>
<h2 id="42匹配出数字">4.2匹配出数字</h2>
<p>比如说我们要匹配出有多少人评价这部电影,我们可以这样写:</p>
<pre><code class="language-python">import re
data = "1059232人评价"
num = re.sub(r'\D', "", data)
print("这里的数字是:", num)
</code></pre>
<p>结果如下:<br>
<img src="https://img-blog.csdnimg.cn/20200412182840739.png" alt="在这里插入图片描述" loading="lazy"></p>
<h1 id="5提取一页中的所有信息">5、提取一页中的所有信息</h1>
<p>比如说我们这里提取最后一页的电影名称,如下:</p>
<pre><code class="language-python">li = html_etree.xpath('//*[@id="content"]/div/div/ol/li')
for item in li:
name = item.xpath('./div/div/div/a/span/text()')
print (name)
</code></pre>
<p>结果如下:<br>
<img src="https://img-blog.csdnimg.cn/20200412183656175.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bm55QXJraW4=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" loading="lazy"><br>
按照这种方法,我们可以把所有的都爬取下来。</p>
<h1 id="6把内容写入文本csv">6、把内容写入文本csv</h1>
<p>代码如下:</p>
<pre><code class="language-python">import csv
# 创建文件夹并打开
fp = open("./豆瓣top250.csv", 'a', newline='', encoding = 'utf-8-sig')
writer = csv.writer(fp) #我要写入
# 写入内容
writer.writerow(('排名', '名称', '链接', '星级', '评分', '评价人数'))
#关闭文件
fp.close()
</code></pre>
<h1 id="7把所有代码汇总">7、把所有代码汇总</h1>
<pre><code class="language-python">import requests, csv, re
from lxml import etree
#设置浏览器代理,它是一个字典
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
# 创建文件夹并打开
fp = open("./豆瓣top250.csv", 'a', newline='', encoding = 'utf-8-sig')
writer = csv.writer(fp) #我要写入
# 写入内容
writer.writerow(('排名', '名称', '链接', '星级', '评分', '评价人数'))
for page in range(0, 226, 25): #226
print ("正在获取第%s页"%page)
url = 'https://movie.douban.com/top250?start=%s&filter='%page
#请求源代码,向服务器发出请求,200代表成功,回退对其,Ctrl+]
reponse = requests.get(url = url, headers = headers).text
# 快捷键运行,Ctrl+Enter
html_etree = etree.HTML(reponse) # 看成一个筛子,树状
# 过滤
li = html_etree.xpath('//*[@id="content"]/div/div/ol/li')
for item in li:
#排名
rank = item.xpath('./div/div/em/text()')
#电影名称
name = item.xpath('./div/div/div/a/span/text()')
#链接
dy_url = item.xpath('./div/div/div/a/@href')
#评分
rating = item.xpath('./div/div/div/div/span/@class')
rating = re.findall('rating(.*?)-t', rating)
if len(rating) == 2:
star = int(rating) / 10#int()转化为数字
else:
star = rating
# 注释ctrl+?
rating_num = item.xpath('./div/div/div/div/span/text()')
content = item.xpath('./div/div/div/div/span/text()')
content = re.sub(r'\D', "", content)
# print (rank, name, dy_url, star, rating_num, content)
# 写入内容
writer.writerow((rank, name, dy_url, star, rating_num, content))
fp.close()
</code></pre>
<p>结果如下:<br>
<img src="https://img-blog.csdnimg.cn/20200412185520367.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bm55QXJraW4=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" loading="lazy"><br>
csv文件中的结果:<br>
<img src="https://img-blog.csdnimg.cn/20200412190425452.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bm55QXJraW4=,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" loading="lazy"><br>
最后爬取结束。</p><br><br>
来源:https://www.cnblogs.com/jyd0124/p/doub.html
頁:
[1]