静态网页的爬取
。提示:以下是本篇文章正文内容,下面案例可供参考
1.煎蛋网爬虫
- 以下代码则简单爬取了煎蛋网的文章标题
#煎蛋网爬虫
import requests
from lxml import etree
url = 'http://jandan.net/'
#因为禁止访问,所以构造user-Agent,以及Cookie,模仿正常电脑
headers = {
'user-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
resp = requests.get(url , headers=headers)
print(resp.status_code) #403 有资源,但无权限,禁止访问 500网关错误(人多)
if resp.status_code ==200:
html = resp.text
# print(html)
dom=etree.HTML(html)
# 小技巧:网页想要分析的地方,右键检查,开发者工具的elements会定位到那里。
# 小技巧:开发者工具eLements, ctrl+f,打开搜索框, 里面尝试xpath表达式。
xpath_pattern = '//div[@class="post f list-post"]/div[@class="indexs"]/h2/a/text()'
titles = dom.xpath(xpath_pattern)
for i in titles:
print(i)
- 实验结果:
2.网易新闻头部 爬虫
# 网易新闻头部 爬虫
import requests
from lxml import etree
url = 'https://news.163.com/'
resp = requests.get(url)
print(resp.status_code)
if resp.status_code == 200:
html = resp.text
# print(html)
dom = etree.HTML(html)
# 新闻网站文章从其它地方爬取、访问量大、自己网站也被其它网站爬取。
# 测试发现,网易新闻非常宽容,不需要伪造请求头,大量请求也不会封ip。
# 备注: 有段时间,网易新闻,开发者工具中xpath可以匹配到,但代码中匹配不到。因为使用了nodejs类前端框架,
# 在第一次请求返回htmL后, js又动态进行了一些修改。所以network中请求的response和代码第一次请求后得到的html为准。
xpath_pattern = '//div[@class="news_default_news"]/ul[@class="top_news_ul"]/li/a/text()'
titles = dom.xpath(xpath_pattern)
# print('titles',titles)
for i in titles:
print(i)
3.网易热点排行标题 爬虫
- 本代码有小部分错误,无法获取<p>标签内的东西
- 有缘人可以指正
#网易热点排行标题
import requests
from lxml import etree
url = 'https://news.163.com/'
resp = requests.get(url)
if resp.status_code == 200:
html = resp.text
dom = etree.HTML(html)
#比对第一次请求后得到的原始html,class有三个值,开发者工具elements中有四个值,说明有js后续生成,应以原始信息为准
# xpath_pattern = '//div[@class="mt35 mod_hot_rank clearfix"]/ul/li/a/text()'
# titles = dom.xpath(xpath_pattern)
# for i in titles:
# print(i)
news_href_pattern = '//div[@class="mt35 mod_hot_rank clearfix"]/ul/li/a/@href'
news_href_lists = dom.xpath(news_href_pattern)
print(news_href_lists)
#找文章详情页
for news_href in news_href_lists:
resp = requests.get(news_href)
html = resp.text
dom = etree.HTML(html)
new_content = '//div[@class="post_body"]/p/text()'
content = dom.xpath(new_content)
print(content)
4.os库
os库:operate system.python 代码控制操作系统功能 ;就像windows 资源管理器,创建文件夹,文件,重命名,删除import os
#打印当前工作目录下的文件和文件夹信息,返回列表
print(os.listdir())
#查看当前工作目录 current work diectory
print(os.getcwd())
#改变工作目录 change dictory
# print(os.chdir('../L02'))
# print(os.listdir())
#判断是否存在文件夹或文件
print(os.path.exists('./aaa'))
#创建文件夹 make dictory 第二次会报错
# os.mkdir('./aaa')
# if not print(os.path.exists('./aaa')):
# os.mkdir('./bbb')
#获取当前脚本所在文件夹
print(os.path.dirname(__file__)) #__file__表示当前脚本本身
#拼文件的完整路径
# file_path ='E:/spiderProject/L03'+'/aaa'+'1.jpg'
file_path = os.path.join(os.path.dirname(__file__),'aaa','1.jpg')
print(file_path)
with open(file_path,'wb') as f:
f.write()
5.debug模式
- 调试运行模式
- 在正式运行前,防止访问次数过多,造成网站封掉我们的IP,则可以利用断点调试代码
import requests
response = requests.get(url='https://www.baidu.com')
#状态码
status_code = response.status_code
if status_code ==200:
#网页数据 bytes
content = response.content
#网页数据 str。 一般直接去text属性,但是少数情况解码错误乱码
text = response.text
text = content.decode('utf-8')
print(text)
url = response.url
headers = response.headers
6.天堂图片网 爬虫
这个网站没什么反爬措施#天堂图片网爬虫 ,这个网站没什么反爬措施
import os
import requests
from lxml import etree
album_url = 'https://www.ivsky.com/tupian/lugui_v62472/'
headers = {
'user-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
}
resp = requests.get(album_url,headers=headers)
# status_code = resp.status_code
html = resp.text
dom = etree.HTML(html)
#获取一个图集下的所有缩略图片
image_pattern = '//ul[@class="pli"]//img/@src'
title_pattern = '//h1/text()'
images = dom.xpath(image_pattern)
titles = dom.xpath(title_pattern)[0]
titles = titles.strip() #途径后可能有空格,但在 makdir() 会自动省略
#以title为文件名创建文件夹
if not os.path.exists('./'+titles):
os.mkdir('./'+titles)
#循环图片地址列表
for i,img_src in enumerate (images):
# print(img_src)
img_src = 'https:' + img_src
img_resp = requests.get(img_src,headers=headers)
# print(resp.status_code)
img_content_bytes = img_resp.content
#图片二进制信息写入本地
image_path = os.path.join(os.path.dirname(__file__),titles,f'{i+1}.jpg')
with open(image_path,mode='wb') as f:
f.write(img_content_bytes)
print(f'第{i+1}张图片保存完毕,保存到了{image_path}')
实验结果:
7.站酷网爬虫
站酷网图集作品默认第一页,下翻后js动态加载后续,现在学的只能爬取下来第一页的图。所以可能出现开发者工具中xpath匹配30个图片,代码中只能下载10个的情况。 后续可以达到更深层次的爬取#站酷网爬虫
import os
import requests
from lxml import etree
album_url = 'https://www.zcool.com.cn/work/ZNTAyNTU4MjQ=.html'
headers = {
'user-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
}
resp = requests.get(album_url,headers=headers)
# status_code = resp.status_code
html = resp.text
dom = etree.HTML(html)
#获取一个图集下的所有缩略图片
image_pattern = '//div[@class="work-show-box mt-40 js-work-content"]//div[@class="photo-information-content"]/img/@src'
title_pattern = '//h2/text()'
images = dom.xpath(image_pattern)
# print(images)
titles = dom.xpath(title_pattern)[0]
titles = titles.strip() #途径后可能有空格,但在 makdir() 会自动省略
#以title为文件名创建文件夹
if not os.path.exists('./'+titles):
os.mkdir('./'+titles)
#循环图片地址列表
for i,img_src in enumerate (images):
# print(img_src)
# img_src = 'https:' + img_src
img_resp = requests.get(img_src,headers=headers)
# print(resp.status_code)
img_content_bytes = img_resp.content
#图片二进制信息写入本地
image_path = os.path.join(os.path.dirname(__file__),titles,f'{i+1}.jpg')
with open(image_path,mode='wb') as f:
f.write(img_content_bytes)
print(f'第{i+1}张图片保存完毕,保存到了{image_path}')
实验结果: