什么是爬虫?
爬虫(又称网络爬虫、Web爬虫)是一种自动化程序,用于在互联网上自动获取数据。通俗来说,它就是一个“小机器人”,可以在万维网上自动地爬取指定网站的数据,从而进行数据处理和分析。
在进行爬虫开发时,我们需要先了解清楚相应的法规和政策,确保自己的行为符合法律的要求。同时,还需要从道德层面考虑,尊重他人的知识产权和隐私权,并保持良好的职业操守,不进行恶意采集、攻击和破坏活动。
学前必知:请勿使用所教技术违法犯罪,信息安全从我做起
区分下以下两种引库方式:
# 以下的引入方式在使用函数时就不再需要写库名了
from urllib.request import urlopen
# 以下的引入方式在使用时需要指明库名
import urllib.request
先爬个百度首页
from urllib.request import urlopen # 引入库
url = "http://www.baidu.com" # 百度首页地址
resp = urlopen(url) # 另外一种引入库的话就得是urllib.request.urlopen
content = resp.read() # 读取网页内容
print(content) # 输出网页源代码
resp.close() # 关闭连接
# 如果想看看自己爬的界面 可以将得到的源代码copy到自己新建的文本文件,再更改为html尾缀查看
# 不过大概率是不能用的,毕竟你爬取的只是html文件,css和js都没有获取
但是输出结果却不是我们所想的图形界面,而是一堆的代码(即网页源代码),而我们所需要的内容就是在这些源码中
但其实运用的更多的requests库(仔细看比上面的多一个s)
区分encode()和decode()
encode()和decode()是Python中用于对字符串进行编码和解码的方法。
b = s.encode(‘utf-8’)
s = b.decode(‘utf-8’)
requests库
# 下载地址: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
import requests
url = 'https://www.csdn.net/'
resp = requests.get(url)
print(resp.text) # 文本形式输出 拿到页面源代码
如果出现编码不匹配情况,请前往setting-Editor-File Encodings里面设置为对应的编码方式
调用百度接口
小案例如下:
import requests # 在pip install requests
query = input("please input someone:")
url = f'https://www.baidu.com/s?ie=UTF-8&wd={query}'
dic = { # 请求头信息 作用就是欺骗服务器让其认为本程序是一个人而非一个程序
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Mobile Safari/537.36"
}
resp = requests.get(url, headers=dic)
print(resp.url)
resp.close()
“User-Agent”的值:打开你自己的浏览器,随便打开一个页面,F12-(右上角Network)-在下面的Headers中寻找(一般在最下面),找到User-Agent后copy就行了
运行结果(在提示下输入周星驰)
咱再试试去
比如说这个url:(前往copy使用)
豆瓣电影信息获取
import requests
url = " https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=0&limit=20"
# 爬虫如果没有效果,那么就是被反爬了
headers ={
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Mobile Safari/537.36"
}
resp = requests.get(url=url, headers=headers)
print(resp.json())
resp.close() # 需要关闭
那么肯定要问了,我这url哪来的?直接按下面说的操作就行!
F12->Network->重新加载->Fetch/XHR->Preview
说起来似乎很简单,但实际时也很简单,可以拿北京新发地试试手,比较简单(毕竟人家不做反爬)
但你爬别人网站时,别人一般都是不爽的,万一它后台一看,ip一封,你就G了,那么代理就显的如此重要了
(简单说就是更换自己的ip地址)
# 一般很少用 原理 通过第三方的机器去发送请求
import requests
# 36.137.208.16:7777
proxies = {
"http": "36.137.208.16:7777" # 看你需要访问的网站是需要http还是https 比如下面那个百度的
# "https":
}
resp = requests.get("https://www.baidu.com", proxies=proxies)
resp.encoding = "utf-8"
print(resp.text)
有些网站怎么判断你是否为程序呢?比如其中一种就是判断您单位时间内访问了几次本网站,访问过多的话肯定就不是人能操作的出来的了,前面的User-Agent就是请求头文件,看看你是不是通过浏览器访问的等一些协议之类的信息,现在的网站基本都配备了这层防护,所以配置User-Agent很有必要
下面不妨再拿豆瓣开开刀
先使用网页端访问一下豆瓣top250
滑动到最下面(默认肯定是从第一页开始的,那么我们先访问一下第二页看看)
此时我们可以很明显的发现url变成了
https://movie.douban.com/top250?start=25&filter=
再看看第三页
https://movie.douban.com/top250?start=50&filter=
发现端倪了,start=后面的数据在变化,且每一页递增25,正好对应每一页有25个电影
于是乎便可开始代码的编写
import requests
import re
import csv
for str1 in range(0, 226, 25):
str2 = str(str1)
url = "https://movie.douban.com/top250?start="+str2+"&filter="
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Mobile Safari/537.36"
}
res = requests.get(url, headers=headers)
page_content = res.text
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<p class="">.*?<br>(?P<year>.*?) .*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
r'.*?<span>(?P<people>.*?)人评价</span>', re.S)
result = obj.finditer(page_content)
# a为追加,w会清空原来的再写入
f = open("data.csv", mode="a", encoding='utf-8')
csvwriter = csv.writer(f)
for it in result:
dic = it.groupdict()
dic['year'] = dic['year'].strip()
csvwriter.writerow(dic.values())
f.close()
运行了便可以得到一个data.csv文件,里面记载了top250的电影名、年份和点赞数
当然这里面设计的还有很多知识点没有讲到,如果文章反响还行的话,将会继续更新更加完善的内容