前言
本次我们使用requests模块以及re模块对天堂电影进行简单的爬取
re模块的简单使用参考:re模块的简单使用
模块的引用
模块库的引用
import re
import requests
代码实现
1·对网站发出请求
# 设定url
url = "https:******************。com"
# 发出requests请求
response = requests.get(url=url,verify=False)# verify=False去掉安全认证
print(response.text)
# 关闭请求,否则多次请求后可能造成程序报错
response.close()
发送请求后我们接收到的网页源码数据如下图:
这样的乱码文字我们我们是看不懂的造成这样的 原因是因为我们的字符集没有搞对
所有我们要在我们原来的代码上做出一定的修改
修改之后的代码:
# 设定url
url = "https://**************/"
# 发出requests请求
response = requests.get(url=url,verify=False)# verify=False去掉安全认证
response.encoding="gb2312" # 指定字符集
response_text = response.text
print(response_text) # 输出
# 关闭请求,否则多次请求后可能造成程序报错
response.close()
当使用如下代码的时候我们得到的结果就是可以看懂阅读的啦,结果如下:
2·使用re模块提取数据
-
首先我们现在网页中查看网页的源代码
-
找到我们要提取的数据模块
这时候就要集合我们之前的re的使用以及正则表达式了 -
集合re模块编写正则表达
# 正则表达式
obj_ul =re.compile(r"2022必看热片.*?<ul>(?P<ul>.*?)</ul>",re.S)
# 再相应数据中提取信息
ul = obj_ul.finditer(response_text)
for ul_lines in ul:
print(ul_lines.group('ul'))
重要提醒:一定不要忘记写re.S!!!!!!!!本人就总是忘,当然也没涨过记性。这是不好的习惯
re.S的作用:
在字符串a中,包含换行符\n,在这种情况下:
如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。
而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。
运行完成后我们得到以下的数据我们得到以下的结果:
4. 进一步的提取数据
很显然上的数据结果也不是我们想要的最重结果,所以我们要对这些数据进行进一步的提取代码如下:
# 获取每个电影的链接:
obj_url = re.compile(r"<a href='(?P<url>.*?)'")
ret = obj_url.finditer(ul)
for its in ret:
url_1 = its.group("url")
print(url_1)
# 获取电影名称
obj_name = re.compile(r"<a href='.*?' title=.*?>(?P<name>.*?)</a>",re.S)
ret_1 = obj_name.finditer(ul)
for it_n in ret_1:
it_name =it_n.group('name')
print(it_name)
- 持久化存储
得到数据后我们要进行持久化的存储
# 持久化存储
with open("定影天堂.txt","a",encoding="utf-8") as sf:
sf.write(it_name+":"+url+url_1+'\n')
我们得到的最后结果是这样的:
在存储的时候我们也可以让他更加美观在这我就不搞了
完整的代码
下面是这个简单的爬虫程序的全部代码:
# 引用库
import re
import requests
# 设定url
url = "https://www.dytt89.com/"
# 发出requests请求
response = requests.get(url=url, verify=False) # verify=False去掉安全认证
response.encoding = "gb2312" # 指定字符集
response_text = response.text
# print(response.text)
# 正则表达式
obj_ul = re.compile(r"2022必看热片.*?<ul>(?P<ul>.*?)</ul>", re.S)
# 再相应数据中提取信息
ul = obj_ul.finditer(response_text)
for ul_lines in ul:
ul = ul_lines.group('ul')
# 获取每个电影的链接:
obj_url = re.compile(r"<a href='(?P<url>.*?)'")
ret = obj_url.finditer(ul)
for its in ret:
url_1 = its.group("url")
print(url_1)
# 获取电影名称
obj_name = re.compile(r"<a href='.*?' title=.*?>(?P<name>.*?)</a>",re.S)
ret_1 = obj_name.finditer(ul)
for it_n in ret_1:
it_name =it_n.group('name')
print(it_name)
# 持久化存储
with open("定影天堂.txt","a",encoding="utf-8") as sf:
sf.write(it_name+":"+url+url_1+'\n')
# 关闭请求,否则多次请求后可能造成程序报错
response.close()
一个小小的提示:在正则表达式的前面加一个小写的’r’可以让他没有下面的小黄线,但是有没有都可以不影响程序的运行。
代码仅供参考,希望可以帮到你,愿君前程似锦,未来可期去💯,感谢您的阅读,如果对您有用希望您留下宝贵的点赞和收藏,如有侵权联系删除