riwfhiu 发表于 2021-1-6 23:29

python爬虫入门通用框架【小白向】

本帖最后由 riwfhiu 于 2021-1-6 23:49 编辑

为了回应那些私信我怎么学习爬虫看什么视频,想爬某某网站图片怎么改代码,怎么获取页面任意元素的属性值。。。
鸽了这么久,它终于来了,requests库的通用爬虫框架!本文纯小白入门向,已入门的或者大佬轻点喷,我自己也是小白

爬虫三步走战略:
一.请求网址
二.解析定位
三.保存数据


不讲虚道理,直接上两个实例:
1.获取百度页面标题“新闻”文本,并写入txt
2.获取百度logo图片,并写入图片png



https://static.52pojie.cn/static/image/hrline/1.gif



1.伪装访问请求头:按F12 >> Network >> 目标网址 >> 找到请求头



https://static.52pojie.cn/static/image/hrline/4.gif

2.定位元素(文本):右键菜单 >> 审查元素


https://static.52pojie.cn/static/image/hrline/4.gif

3.定位元素(图片):同理右键菜单 >> 审查元素



https://static.52pojie.cn/static/image/hrline/1.gif


'''
需要两个库,打开cmd进行安装
pip3 install requests
pip3 install lxml

'''
import requests,json
from lxml import etree

#=====================================请求区==========================================#
#get模式,获取网页源码,传入参数:url(字符串)
def gethtml(url):
    #伪装头文件,F12打开浏览器,刷新一次:Network > 选目标链接(默认第一个) > Headers
    headers={
    #User-Agent 浏览器标识头,爬虫必备,最好带上。
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
    "Cookie":"",      #cookie相当于临时登陆凭证,作用跟账号密码一样,有效期由网站决定,几天到几月不等。带cookies伪装表示已登陆状态。
    "Referer":"https://www.baidu.com",      #Referer表示来源地址,有些网站会检测跨域访问,不合法会拒绝。
    #剩下其它的一些伪装如果能正常访问可以不添加,不能就加上吧
    #"Upgrade-Insecure-Requests": "1",      #比如这个属性是百度网址的,其它网址可能有其它属性值
    }
    r=requests.get(url,headers=headers)   #正式get请求
    if r.status_code !=200:               #状态码判断返回是否成功,不成功则报错退出
      print("获取url:%s失败!"%(url))
      exit()
    return r                            #直接返回r,为什么不直接返回r.text(文本),因为图片/视频格式是r.content(用二进制写入)


#=====================================解析区==========================================#
#xpath解析接口,输入:xpath格式字符串'//div/img[@id="s_lg_img_new"]'注意外面一层是单引号,返回值为list,元素为字符串
#我个人推荐xpath,轻巧强大好用,浏览器自带解析路径,不会写的直接无脑copy,右键元素 > Copy > CopyXpath,复制字符串传入参数即可
#xpath字符串通用写法://标签[@属性="属性值"]/下一级标签[@属性="属性值"]/text() 取出文本 /@src取出src地址
#例子://div[@class="text-content"]/a/@href      #取出div下的第2个a的href属性值。
def getxpath(r,str):
    html = etree.HTML(r.text)
    reslist = html.xpath(str)
    return reslist


#=====================================保存区==========================================#
#爬虫目的一般为获取文本/图片/视频等数据,一般要保存下来慢慢看
#文本写入txt,传入参数:txtpath路径,data数据
def writetxt(txtpath,data_str):                         #文本的名字和路径,也可以使用绝对路径,例如 "D:\\爬虫学习\\采集文本.txt"      
    with open(txtpath, "w") as f:
      f.write(str(data_str))

#图片写入jpg/png,传入参数:imgpath路径,content二进制数据
def writeimg(imgpath,content):      #图片的名字和路径
    with open(imgpath, "wb") as f:
      f.write(content)


#================以上三大块就是通用爬虫模板,下面是自己写的想实现的功能====================#
#获取百度首页"新闻"字样,并写入txt中
def get_news_txt():
    #第一步:请求网址先获取html
    url="https://www.baidu.com"
    r=gethtml(url)
    #第二步:解析路径,找到标题对应的xpath路径
    title_xpath='//div[@id="s-top-left"]/a/text()'       #注意外面一层是单引号'',a表示选中第一个a标签, text()取出文本
    title_list=getxpath(r,title_xpath)            #别忘记传入r页面源码哦
    new_str=title_list
    print(f"获取到的文本为:{new_str}")
    #第三步:保存数据写入txt文件中
    writetxt("./爬到的第一个文本.txt",str(new_str))         #文本只能写入字符串
    print("恭喜你爬取了一个文本数据!快打开文件看看吧")

    '''
    #下面是扩展测试# 如果我想打印整个标题栏的所有文本
    title_xpath='//div[@id="s-top-left"]/a/text()'       #a没有选中具体值,返回所有匹配的值
    title_list=getxpath(r,title_xpath)            #别忘记传入r页面源码哦
    print("#====都让开,小孩子才做选择,我全都要!====#")
    title_str=""
    for one in title_list:
      print(one)
      title_str+=str(one)+""
    writetxt("./爬到的第一个文本.txt",str(title_str))
    print("恭喜你写入了一个爬虫数据!快打开文件看看吧")
    '''

#获取百度logo,并写入图片中
def get_baidu_logo():
    #同理第一步先请求网址
    url="https://www.baidu.com"
    r=gethtml(url)
    #第二步解析路径
    logo_url_list=getxpath(r,'//img[@id="s_lg_img_new"]/@src')         #这个img一定要找对哦,右键审查元素不一定全都准确,还有这次要取的属性为src链接,而不是text文本
    logo_url=logo_url_list       #如果只有一个值就取
    print(f"获取到了logo图片地址文本:{logo_url},很明显没有https:这个开头,加个即可完成")
    #处理字符串
    logo_url="https:"+logo_url
    #获取到了logo地址了,直接访问获取图片
    r=gethtml(logo_url)
    #写入图片
    writeimg("./百度logo.png",r.content)   #注意!注意!注意!图片是二进制格式写入,用r.content二进制数据,不要传入r.text文本
    print("恭喜你写入了一张稀有图片(金色传说)!快打开图片看看吧")





#下面这个相当于C语言的main入口
if __name__ == '__main__':
    #获取百度首页"新闻"字样,并写入txt中
    get_news_txt()

    #获取百度logo,并写入图片中
    get_baidu_logo()

    print("\n==============恭喜你完成简单的爬虫任务,顺利毕业啦!===============\n")
    #print("快去爬取淘宝吧!不是 (狗头doge)")




https://static.52pojie.cn/static/image/hrline/4.gif


通用框架虽然简单,但修修改改还是可以爬不少网站的,而且保留大量注释给新手说明,基本都能看懂吧。
最快的学习方法就是直接上手撸码,而不是看什么视频学习,不懂再去搜索。
当然连一些html简单基础或者python基础语法都不懂的真小白,只推荐一处学习网站:
【中国大学mooc】:https://www.icourse163.org/
(搜“嵩天”,真正的大佬,启蒙的老师,对小白超友好,别去b站搜索什么营销号的盗版视频了,全损音质不说,废话是真的多)


#========================作者专用挖坑机=============================#
下一章节:post模式全解析,让爬虫发出网络的第一声啼鸣(嗷呜~)

=====下章更新时间:2021春节前后,这次应该不咕了,嗯应该吧


希望这篇文章对你有用,记得给个热心值呀,这样才有动力去更新呀~


慵懒丶L先森 发表于 2021-1-7 02:09

看视频或者书籍的正确观:并不是说看了就会,视频和书籍是辅助工具,真正要学习起来的话就是对照着视频和书籍挨个挨个敲代码,多注释。然后开始有目的性的用学到的东西造轮子。感谢分享,这帖子对于新手挺友好的,爬虫基本上也就是这个框架了,后期要学的就是突破反爬虫机制

十一大魔王i 发表于 2021-1-6 23:39

先收藏了

飓风861 发表于 2021-1-7 00:05

收藏了,谢谢大佬

知味8848 发表于 2021-1-7 00:09

已收藏评分,希望系列更新

lcl0219 发表于 2021-1-7 00:12

感谢大佬收藏了

a3322a 发表于 2021-1-7 07:03

感谢分享,很有帮助!

zz1181 发表于 2021-1-7 07:23

很需要呀,谢谢大佬

nullable 发表于 2021-1-7 08:08

感谢大佬分享,已经写得十分细致。

lfm333 发表于 2021-1-7 08:22

学习了,感谢大佬分享
页: [1] 2 3 4 5 6 7 8
查看完整版本: python爬虫入门通用框架【小白向】