Python 爬虫实战,模拟登陆爬取数据

从0记录爬取某网站上的资源连接:

  • 模拟登陆
  • 爬取数据
  • 保存到本地

结果演示:

源网站展示:

爬到的本地文件展示:


环境准备:

python环境安装

安装requests库

使用以下命令安装requests库

#(如果使用的是anaconda 下虚拟环境里的python   请在虚拟环境里执行下边命令)
pip install requests

安装bs4库

使用以下命令安装requests库

#(如果使用的是anaconda 下虚拟环境里的python   请在虚拟环境里执行下边命令)
pip install bs4

小试牛刀

环境准备好之后,可以写一个简单的Demo来测试一下
以CSDN下手

import requests
from bs4 import BeautifulSoupdef get_html(url):sesson = requests.Session()start_html = sesson.get(url)  #使用requests来发送请求soup = BeautifulSoup(start_html.text, 'lxml')  #使用BS4框架来解析网页源码print(soup)if __name__=='__main__':url = 'https://www.csdn.net/'get_html(url)

正常输出网页代码:略

模拟登陆:

一般上边的代码获取网页源码之后就可以爬去自己想要的内容了,但是某些网站需要登陆之后才能获取想要爬去的内容。Python模拟登陆网站的方式有很多种,这里只介绍一种简单的使用网站cookie的方法:

  1. 首先,在浏览器端登录账号,用然后用网页工具获取登陆之后的cookie,以Chrome浏览器为例:在登陆界面按F2,点击Network,然后输入账号密码进行登陆

登陆之后,在name那一列找到含有cookies信息的文件点进去,然后在右边的Header里找到cookies和user-agent信息并保存下来。user-agent信息就是浏览器的信息,等会在写爬虫的时候要伪装成自己的浏览器,不然某些网站会有反爬虫机制,程序获取不了网页信息会报HTTP Error 403: Forbidden错误

  1. 在python中设置请求的头部,将爬虫伪装成浏览器,同时把cookies信息一起放到headers中。(小技巧:在pycharm中可以先敲一对引号,然后将cookies信息粘贴到引号中,这样可以省去调格式的时间;网站不需要登陆的把user-agent信息写到headers即可,避免发生HTTP Error 403: Forbidden错误)
    提示:实际上可以只用其中的某一段就可以实现登陆,我对cookies不太熟悉,所以选择了全部复制了过来,但是在使用的时候,有时候会不好使,我也不太清楚是为什么,在仔细观察cookies的内容是,发现有些参数对应多个值,把多余的删除之后就好使了
def get_html(url):headers = {'Cookie': 'only=a61236e8-cff4-40d7-98e5-cab9e6874859; .5118.referer={"TParam":"","QuestionParam":"","Referer":""}; .AspNet.ApplicationCookie=Rslw2TBMXcBLcyi9DG6RJQDgWLCZ7973g8KxyqK3seRjXMbQz8m1czehB75WXRWYSHzWwtUe_6QaRZ9tBp8h_asbnq2ctRnfUSl-L09fUOD6OCCEqo3kYLcj_-HiuaBT5mazCGMGG2gcpge2mBZGsAzbGIv57rAkfY0EQvYdX43VlPY4_DAPX-kNpA9y4ald3OeOINjyvzOMulX9LrUv726BHoup7Ql7Oyt03sMDS3RZGXEEBhiScoJDArVv-fiHfYB2wiA22q8gpLn-6MAZKpIYAl-XrdZdtcUdyHWFqKinU9TL46ZRNBWcbYoBrHjD4_VbNZ-5-SeoWTdw0QIIkLM-TJLn5UtGkhl5Sz63MRe1yuBuVokyjeaBwoFRFwG3soHsDjXHxXZ2VirvQK9TjBjvJwHhs5GR4-ODtJ_ZusN2c_BH4iFCQA2odzpejpA-IgoXeM5d4oO-eHekevGMvRfGEhd6rwjkiDITiSg9H38CVi-9J9g3IJlaYDDQzyTr8L9geewV8UOWUvPSWIr6yKQFEQ2qYJBuZw80xyohb54; ASP.NET_SessionId=n3yasgl3mumdnqkgypbanuxb; _5118_yx=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1Z3VpZCI6IjcyYjg0MGRkLWNjZmYtNGM1Ni1iOTkzLTZhNGNkYTg4ZjdjNiIsInVpZCI6OTkzMzY3LCJhdWQiOiJ3d3cuNTExOC5jb20iLCJpc3MiOiJ3d3cuNTExOC5jb20ifQ.diqxAy0k5GOmXjoVVQ9eFH-Hm6iKy97HfhIALa7dllM; Hm_lvt_f3b3086e3d9a7a0a65c711de523251a6=1606052087; Hm_lpvt_f3b3086e3d9a7a0a65c711de523251a6=1606130500','User-Agent': 'Mozilla/5.0(Linux;Android6.0;Nexus5Build/MRA58N) AppleWebKit/537.36(KHTML, likeGecko) Chrome/87.0.4280.66MobileSafari/537.36'}  ###设置请求的头部,伪装成浏览器sesson = requests.Session()start_html = sesson.get(url,headers=headers)  #使用requests来发送请求soup = BeautifulSoup(start_html.text, 'lxml')  #使用BS4框架来解析网页源码return soup

爬取数据:

数据定位

在浏览器上按F2,点击开发者界面左上角的箭头,然后去页面上点击自己想要的数据,就会精确定位到页面元素在代码中的位置:


可以看到,想要的电影信息在两个a标签中,我们的目的是为了循环的获取页面所有的电影网站的信息,而每个电影信息都在dd标签中,所以应该找到其唯一的父标签,我们用class属性来判断其是否唯一。dd的父标签为dl,dl的class为dl-rank不唯一,所以继续向上找其父标签div,class为Fn-ui-list list,我们使用ctrl+f寻找Fn-ui-list list,发现标签唯一,所以我们要在这个div中循环获取电影的信息


获取唯一的标签,可以使用find,

# attrs 中是限制标签唯一的属性
div =  soup.find(name ='div', attrs={"class":"Fn-ui-list list"})

div中有多个dl,获取dl,必须使用find_all

# 获取的dl是一个 包含所有dl标签的列表
dl=  div.find_all('dl')

当找到目标标签的时候电影网址的时候可以使用 .string 来获取标签的内容, 使用 .get()来获取标签内部的属性的值:

# 获取a标签的内容  爱奇艺
movie_name =  a.string
# 获取a标签的href的值   XXXXXXX
movie_url = a.get('href')

有上边的方式之后,我们就可以使用循环来获取更多的信息了

def get_info(url):soup = get_html(url)movie_url = []movie_name = []div = soup.find(name='div', attrs={"class": "Fn-ui-list list"})l = 0  # 跳过第一个dl标签for i in div.find_all('dl'):l += 1if l == 1:continue# 获取dd标签dd = i.find(name='dd', attrs={"class": "col2-5 keyword"})# 获取span标签span = dd.find('span')# 获取所有a标签a = span.find_all('a')# 获取有电影网址的a标签link = span.find(name='a', attrs={"class": "url"})# 获取电影站的名字name = a[0].string# 从网页上获取的name中可能有特殊字符   在保存的时候会出错,  把特殊字符删除即可name = name.replace(u'\xa0', u'')name = name.replace(u'\u2006', u'')name = name.replace(u'\ue74b', u'')name = name.replace(u'\u200d', u'')# 保存到列表中movie_name.append(name)movie_url.append(link.string)return movie_url, movie_name

循环结束之后 就获取了该页面所有的电影网站信息

保存到本地

def save(movie_name, movie_url):#将电影站名和网址打包为一个列表movies = list(zip(movie_name,movie_url))#打开一个csv文件  没有的话自动创建   存在的话往里头追加数据f = open('E:/movies.csv', 'a+', encoding='GBK', newline='')# 2. 基于文件对象构建 csv写入对象csv_writer = csv.writer(f)# 3. 构建列表头csv_writer.writerow(["电影名", "地址"])# 4. 写入csv文件内容for row in movies:print(row)csv_writer.writerow(row)# 5. 关闭文件f.close()print("has saved!")

完整的代码

import requests
import csv
from bs4 import BeautifulSoupdef get_html(url):headers = {'Cookie': 'only=a61236e8-cff4-40d7-98e5-cab9e6874859; .5118.referer={"TParam":"","QuestionParam":"","Referer":""}; .AspNet.ApplicationCookie=Rslw2TBMXcBLcyi9DG6RJQDgWLCZ7973g8KxyqK3seRjXMbQz8m1czehB75WXRWYSHzWwtUe_6QaRZ9tBp8h_asbnq2ctRnfUSl-L09fUOD6OCCEqo3kYLcj_-HiuaBT5mazCGMGG2gcpge2mBZGsAzbGIv57rAkfY0EQvYdX43VlPY4_DAPX-kNpA9y4ald3OeOINjyvzOMulX9LrUv726BHoup7Ql7Oyt03sMDS3RZGXEEBhiScoJDArVv-fiHfYB2wiA22q8gpLn-6MAZKpIYAl-XrdZdtcUdyHWFqKinU9TL46ZRNBWcbYoBrHjD4_VbNZ-5-SeoWTdw0QIIkLM-TJLn5UtGkhl5Sz63MRe1yuBuVokyjeaBwoFRFwG3soHsDjXHxXZ2VirvQK9TjBjvJwHhs5GR4-ODtJ_ZusN2c_BH4iFCQA2odzpejpA-IgoXeM5d4oO-eHekevGMvRfGEhd6rwjkiDITiSg9H38CVi-9J9g3IJlaYDDQzyTr8L9geewV8UOWUvPSWIr6yKQFEQ2qYJBuZw80xyohb54; ASP.NET_SessionId=n3yasgl3mumdnqkgypbanuxb; _5118_yx=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1Z3VpZCI6IjcyYjg0MGRkLWNjZmYtNGM1Ni1iOTkzLTZhNGNkYTg4ZjdjNiIsInVpZCI6OTkzMzY3LCJhdWQiOiJ3d3cuNTExOC5jb20iLCJpc3MiOiJ3d3cuNTExOC5jb20ifQ.diqxAy0k5GOmXjoVVQ9eFH-Hm6iKy97HfhIALa7dllM; Hm_lvt_f3b3086e3d9a7a0a65c711de523251a6=1606052087; Hm_lpvt_f3b3086e3d9a7a0a65c711de523251a6=1606130500','User-Agent': 'Mozilla/5.0(Linux;Android6.0;Nexus5Build/MRA58N) AppleWebKit/537.36(KHTML, likeGecko) Chrome/87.0.4280.66MobileSafari/537.36'}  ###设置请求的头部,伪装成浏览器sesson = requests.Session()start_html = sesson.get(url,headers=headers)  #使用requests来发送请求soup = BeautifulSoup(start_html.text, 'lxml')  #使用BS4框架来解析网页源码return soupdef get_info(url):soup = get_html(url)movie_url = []movie_name = []div = soup.find(name='div', attrs={"class": "Fn-ui-list list"})l = 0  # 跳过第一个dl标签for i in div.find_all('dl'):l += 1if l == 1:continue# 获取dd标签dd = i.find(name='dd', attrs={"class": "col2-5 keyword"})# 获取span标签span = dd.find('span')# 获取所有a标签a = span.find_all('a')# 获取有电影网址的a标签link = span.find(name='a', attrs={"class": "url"})# 获取电影站的名字name = a[0].string# 从网页上获取的name中可能有特殊字符   在保存的时候会出错,  把特殊字符删除即可name = name.replace(u'\xa0', u'')name = name.replace(u'\u2006', u'')name = name.replace(u'\ue74b', u'')name = name.replace(u'\u200d', u'')# 保存到列表中movie_name.append(name)movie_url.append(link.string)return movie_name, movie_urldef save(movie_name, movie_url):#将电影站名和网址打包为一个列表movies = list(zip(movie_name,movie_url))#打开一个csv文件  没有的话自动创建   存在的话往里头追加数据f = open('E:/movies.csv', 'a+', encoding='GBK', newline='')# 2. 基于文件对象构建 csv写入对象csv_writer = csv.writer(f)# 3. 构建列表头csv_writer.writerow(["电影名", "地址"])# 4. 写入csv文件内容for row in movies:print(row)csv_writer.writerow(row)# 5. 关闭文件f.close()print("has saved!")if __name__=='__main__':url = 'xxxxxxxx'movie_name, movie_url = get_info(url)save(movie_name, movie_url)

Python 爬虫实战,模拟登陆爬取数据相关推荐

  1. python爬虫实战之异步爬取数据

    python爬虫实战之异步爬取数据 文章目录 前言 一.需求 二.使用步骤 1.思路 2.引入库 3.代码如下 总结 前言 python中异步编程的主要三种方法:回调函数.生成器函数.线程大法. 以进 ...

  2. python爬虫实战之多线程爬取前程无忧简历

    python爬虫实战之多线程爬取前程无忧简历 import requests import re import threading import time from queue import Queu ...

  3. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  4. 《python爬虫实战》:爬取贴吧上的帖子

    <python爬虫实战>:爬取贴吧上的帖子 经过前面两篇例子的练习,自己也对爬虫有了一定的经验. 由于目前还没有利用BeautifulSoup库,因此关于爬虫的难点还是正则表达式的书写. ...

  5. Python爬虫实战一之爬取糗事百科段子

    点我进入原文 另外, 中间遇到两个问题: 1. ascii codec can't decode byte 0xe8 in position 0:ordinal not in range(128) 解 ...

  6. Python爬虫实战:selenium爬取电商平台商品数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  7. Python爬虫实战练习:爬取微信公众号文章

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:徐洲更 为了实现该爬虫我们需要用到如下工具 Chrome浏览器 Py ...

  8. Python爬虫实战Pro | (1) 爬取猫眼电影Top100榜单

    在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的序号,片名,主演,上映日期,评分和封面等内容. 之前在Python爬虫实战(1)中我们曾爬取 ...

  9. Python爬虫实战之电影爬取过程

    俗话说,兴趣所在,方能大展拳脚.so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程. 实现功能: 从网站上爬取采 ...

最新文章

  1. php先分组后排序,PHP数组分组排序实例代码
  2. “领导跳槽想带我走,我要不要跟?”
  3. word中下移置顶的表格
  4. 【Kaggle-MNIST之路】CNN再添加一个层卷积(八)
  5. CSS三大特性(129-135 )
  6. AcWing 1087. 修剪草坪28
  7. SpringCloud Zuul(九)之路由自动刷新原理
  8. Linux文件属性2——使用stat函数获取文件属性
  9. 红旗linux修改个人密码,LINUX红旗5.0的用户名和密码!
  10. C++11 新特性整理 (1)
  11. 倍频程分析函数matlab,瞬时声压时域数据怎么用matlab进行1/3倍频程声压级分析
  12. JSON与MAP之间的转换
  13. 操作系统android9.0,三星公布了升级Android9.0操作系统的时间表
  14. 十二款常用摄影软件,大部分人只用过十种!
  15. 故障:删除不存在的设备或完全卸载驱动程序
  16. HDFS—Web页面操作
  17. java中的Int范围
  18. Topic 15. 临床预测模型之决策曲线 (DCA)
  19. 2021-08-11
  20. colt mrr_Learning To Rank 介绍

热门文章

  1. 如此正经,日本首部让人流泪的VR电影诞生
  2. 【wiki维基百科中文数据集】抽取wiki数据集——实操
  3. 前端websocket和后端传输数据
  4. jQuery ajax请求两次问题,jquery ajax请求了两次问题
  5. 【再聚乌镇】百余家大数据企业齐聚,发布七大榜单两大产业地图,共览大数据产业全景!...
  6. Android常见页面布局
  7. 【人脸识别(三)】:使用face_recognition库实现人脸识别,python实现
  8. zookeeper 启动失败,报错 “ZooKeeper JMX enabled by default”
  9. 数字图像处理-DFTDCTWHT小波变换分解重构(Matlab)
  10. 淘淘商城23_Linux上的操作_solr集群的搭建、zookeeper集群的搭建