我の爬虫学习笔记

入门启蒙

 

 入门启蒙文章:如何入门 Python 爬虫? - 知乎现在我的口号:写代码!搜问题!调BUG!

主要参考书《Python网络爬虫从入门到实践》。使用pycharm+python3。浏览器主要是Chrome。

补充知识

 Http协议的请求方法,请求头部,请求数据 

 HTTP 请求/响应的步骤:
客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容
1、客户端连接到Web服务器
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应
4、释放连接TCP连接
5、客户端浏览器解析HTML内容

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文.

HTTP请求方式中8种请求方法(简单介绍) - 韦邦杠 - 博客园

HTTP协议中的14种请求方法 | 精彩每一天

 我的第一个爬虫

  

import requests
from bs4 import BeautifulSoup
link="http://www.santostang.com/"
#获取页面
headers={'User-Agent':'Mozilla/5.0(Windows;U;Windows '
                      'NT 6,1;en-US;rv:1.9.1.6)Geck0/20091201 Firefow/3,5.6'}
r=requests.get(link,headers=headers)
#获取需要的数据
soup=BeautifulSoup(r.text,"lxml")
title=soup.find("h1",class_="post-title").a.text.strip()
print(title)
with open('title.txt',"a+") as f:
    f.write(title)
    f.close()

说明:

1.requests.get(link,headers=headers)获取网页。headers伪装成浏览器访问。r是respond返回对象,r.text获取网页内容。

2.把html转换为soup对象。soup.find("h1",class_="post-title").a.text.strip()得到第一篇文章的标题。

3.chrome检查功能。crtl+shift+I进入开发者模式,可以定位对应位置的代码。

4.python文件操作储存txt文件。

 

 

 遇到的问题:bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library? 

bs4解析网页时 bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml_LitterTwo的博客-CSDN博客在安装了lxml包之后就没问题了。 

静态网页抓取

 学习使用requests获取响应内容:

import requests
r=requests.get('http://www.santostang.com/')
print("文本编码:",r.encoding)
print("响应状态码:",r.status_code)
print("字符串方式的响应体:",r.text)

 说明:

1r.text服务器响应内容。自动根据响应头部字符编码解码。

2r.encoding服务器内容使用的文字编码。

3r.status_code检测响应状态码。

4r.content字节方式的响应体。自动解码gzip和deflate编码。

5r.json()内置的JSON解码器。

定制requests:有些网络需要设置requests参数。URL,定制请求头条,发送POST请求,设置超时等。

URL参数:

在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。也可认为由4部分组成:协议、主机、端口、路径。URL 参数是追加到 URL 上的一个名称/值对。参数以问号 (?) 开始并采用 name=value 的格式。如果存在多个 URL 参数,则参数之间用一个 (&) 符隔开。

import requests
key_dict={'key1':'value1','key2':'value2'}
r=requests.get('http://httpbin.org/get',params=key_dict)
print("URL已经正确编码:",r.url)
print("字符串方式的响应体\n",r.text)
#URL结果
#URL已经正确编码: http://httpbin.org/get?key1=value1&key2=value2

说明:

参数保存在字典里面,用params构建URL中。 

请求头:

《Python——爬虫【Requests设置请求头Headers】

POST请求:

当需要发送编码为表单格式的数据,请求为POST。需要传递字典给Requests的data参数,这个数据字典就会自动编码为表单形式。

import requests
key_dict={'key1':'value1','key2':'value2'}
r=requests.post('http://httpbin.org/post',data=key_dict)
print(r.text)

 说明:

from变量值为key_dict的输入值。

另:发现有人建议使用postman提高效率。

实践&问题

爬取豆瓣电影TOP250.网站地址:http://movie.douban.com/top250.

请求头:实际浏览器请求头。

步骤:

·网站分析:打开网页使用”检查“功能查看网页的请求头。

·requests获取电影网页代码,for实现翻页。

·BeautifulSoup解析网页并获取电影数据。(解析网络暂不涉及)

 

 问题:1Failed to load resource: net::ERR_TIMED_OUT超时

2Failed to load resource: net::ERR_CONNECTION_CLOSED加载资源失败:网络错误连接

3不推荐使用非JS模块文件。

4.而且我每一次刷新显示的错误都不一样。

完全不理解。

 我明白了应该是过滤器过滤掉了。chorme 开发者工具 network 下的 name 为什么总是空的【chrome吧】_百度贴吧

 

没错把它改成蓝的就好啦 

#得到HTML代码
import requests
def get_movies():
    headers={
    'user-agent':'Mozilla/5.0  (Windows NT 6.1; Win64; x64)'
                 'AppleWebkit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',
     'Host': 'movie.douban.com'
    }
    for i in range(1,10):
        link='https://movie.douban.com/top250?satart'+str(i*25)
        r=requests.get(link,headers=headers,timeout=10)
        print(str(i+1),"页面响应状态码:",r.status_code)
        print(r.text)

get_movies()

·怎么在浏览器中获取请求头Headers信息_yqning123的博客-CSDN博客 

·访问网站时出现“net::ERR_CONNECTION_CLOSED”? | 微信开放社区

动态网页抓取

 

静态网页的内容仅仅在HTML中,但是使用JavaScript是动态网络,内容并不全在HTML之中。动态网页需要学习两个技术:①通过审查元素解析真实网页地址②使用selenium模拟浏览器。

通过审查元素解析真实网页地址 

 1.异步更新技术AJAX

AJAX 教程 | 菜鸟教程

 2.解析真实地址抓取

实例内容见原书:第四章 – 4.2 解析真实地址抓取

①开发者模式Network。

②找到真实的数据地址,“抓包”文件。一般用json文件格式获取。选择XHP选项找到。 

③请求地址得到json数据。

④从json之中提取评论数据。使用json库解析数据。 

如果要爬取类似淘宝网评论这种用AJAX加载的网页的话,从网页源代码中是找不到想要的数据的。需要用浏览器的审查元素,找到真实的数据地址。然后爬取真实的网站。

import requests
link = """https://api-zero.livere.com/v1/comments/list?callback=jQuery112403473268296510956_1531502963311&limit=10&repSeq=4272904&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1531502963313"""
headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
r = requests.get(link, headers= headers)
print (r.text)

import json
# 获取 json 的 string
json_string = r.text
json_string = json_string[json_string.find('{'):-2]
json_data = json.loads(json_string)
comment_list = json_data['results']['parents']
for eachone in comment_list:
    message = eachone['content']
    print (message)

说明:使用json_string[json_string.find(‘{‘}:-2)], 仅仅提取字符串中符合json格式的部分。然后,使用 json.loads 可以把字符串格式的响应体数据转化为 json 数据。然后,利用 json 数据的结构,我们可以提取到评论的列表comment_list。最后再通过一个 for 循环,提取其中的评论文本,并输出打印。

3.URL地址规律和for循环爬取

URL地址中两个重要变量:offset和limit。limit:每页最大评论量,offset:本页第一条评论是总的第几条。在URL中改变offset就可以实现换页。

import requests
import json
def single_page_comment(link):
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    r = requests.get(link, headers= headers)
    # 获取 json 的 string
    json_string = r.text
    json_string = json_string[json_string.find('{'):-2]
    json_data = json.loads(json_string)
    comment_list = json_data['results']['parents']
    for eachone in comment_list:
        message = eachone['content']
        print (message)
for page in range(1,4):
        link1 = "https://api-zero.livere.com/v1/comments/list?callback=jQuery112403473268296510956_1531502963311&limit=10&offset="
        link2 = "&repSeq=4272904&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1531502963316"
        page_str = str(page)
        link = link1 + page_str + link2
        print (link)
        single_page_comment(link)

补充

爬虫快速入门(二):动态网页爬取 - 知乎

“selenium库用起来比较繁琐,抓取速度相对较慢,所以第一种方法日常使用较多。”

我没有成功运行selenium方法的代码。  

①找到JS渲染后的源代码,也是当前网站显示内容的源代码。

开发者模式下。Headers下包含当前包的请求消息头、响应消息头;Preview是对响应消息的预览,Response是服务器响应的代码。依次点击XHR、JS下的所有包,通过Preview来预览当前包的响应信息,寻找我们想要的结果。

②找到Request URL、真正应该请求的路径。

③根据找到的路径写代码。

 使用selenium模拟浏览器

通常情况下,chrome获取源地址可能并不容易,这时候使用浏览器渲染引擎的方法。直接用浏览器在显示网页时解析HTML,应用CSS样式并执行JavaScript的语句。用Python的selenium库模拟浏览器完成抓取。

selenium的脚本可以控制浏览器进行操作。下面代码使用Firefox浏览器。安装包之后,需要​​​​​​下载geckodriver Releases · mozilla/geckodriver · GitHub 。并将其添加到PATH当中。

from selenium import webdriver
driver = webdriver.Firefox(executable_path = r'C:\Users\santostang\Desktop\geckodriver.exe')
#把上述地址改成你电脑中geckodriver.exe程序的地址
driver.get("http://www.santostang.com/2018/07/04/hello-world/")

由于Selenium使用浏览器渲染,因此,那些评论数据已经渲染到了HTML代码中。我们可以使用Chrome“检查”方法,定位到元素位置。

1找到评论的HTML代码标签。使用Chrome打开该文章页面,定位到评论数据。
2尝试获取一条评论数据。
3键入driver.page_source,对iframe解析。
from selenium import webdriver
import time
driver = webdriver.Firefox(executable_path = r'C:\Users\santostang\Desktop\geckodriver.exe')
driver.implicitly_wait(20) # 隐性等待,最长等20秒
#把上述地址改成你电脑中geckodriver.exe程序的地址
driver.get("http://www.santostang.com/2018/07/04/hello-world/")
time.sleep(5)
for i in range(0,3):
    # 下滑到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 转换iframe,再找到查看更多,点击
 driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))
    load_more = driver.find_element_by_css_selector('button.more-btn')
    load_more.click()
    # 把iframe又转回去
    driver.switch_to.default_content()
    time.sleep(2)
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))
comments = driver.find_elements_by_css_selector('div.reply-content')
for eachcomment in comments:
    content = eachcomment.find_element_by_tag_name('p')
    print (content.text)

然后就有bug打不开了。

 

 selenium选择元素的方法-:

  • find_element_by_id:通过元素的id选择,例如:driver.find_element_by_id(‘loginForm’)
  • find_element_by_name:通过元素的name选择,driver.find_element_by_name(‘password’)
  • find_element_by_xpath:通过xpath选择,driver.find_element_by_xpath(“//form[1]”)
  • find_element_by_link_text:通过链接地址选择
  • find_element_by_partial_link_text:通过链接的部分地址选择
  • find_element_by_tag_name:通过元素的名称选择
  • find_element_by_class_name:通过元素的id选择
  • find_element_by_css_selector:通过css选择器选择

解析网页

在利用requests 库爬取下源代码之后,需要解析网页提取数据。

三种常见方法:正则表达式、BeautifulSoup和lxml方法。Due to my laziness,不打算学正则表达式的方法。

提前安装bs4库。

Beautiful Soup documentationhttps://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.htmlbeautifulsoup菜鸟教程 - python - web教程网 

python标准库解析器:BeautifulSoup(markuo,"html.parser")

lxml HTML解析器:BeautifulSoup(markuo,"lxml")需要安装C语言库

解析器:BeautifulSoup(markuo,["lxml","xml"])需要安装C语言库

html5lib:BeautifulSoup(markuo,"html.parser")速度慢,不依赖外部扩展,容错性最好。

使用 Beautiful Soup 解析网页内容_过了即是客-CSDN博客_使用beautifulsoup解析

实例:

import requests
from bs4 import BeautifulSoup

link="http://www.santostang.com/"
headers={'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT6.1; en-us; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
r = requests.get(link, headers=headers)
soup= BeautifulSoup(r.text,"html.parser")
first_title = soup.find("h1", class_ ="post-title").a.text.strip()
print("第一篇文章的标题是:",first_title)

BS对象是一个复杂的树型结构。获取网页内容的过程就是提取对象(树的节点)的过程。提取的方法有:遍历文档树,搜索文档树 ,CSS选择器。

一点学习反思

·看书和看网上笔记相结合。书上的知识不能保证是最新的技术。

·开发者模式支持中文真的爽。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python合法网页爬虫工具项目分享 内容概览: 这个分享包涵了我开发的Python爬虫工具项目,主要用于合法爬取某些网页信息。以下是主要内容: 源代码:包括Python代码和相关脚本。这些代码展示了如何使用Python进行网页抓取、解析和数据提取。 项目文件:除了代码,我还分享了整个项目的文件,包括设计稿、图标、图片等资源。这些资源对于理解项目背景和设计思路至关重要。 文档与操作手册:为了方便他人理解和使用我的作品,我编写了详细的操作手册和使用说明,同时提供了一份Markdown格式的文档,概述了项目的主要功能和特点。 学习笔记:在项目开发过程中,我记录了大量的学习笔记和心得体会。这些笔记不仅有助于理解项目的开发过程,还能为学习Python爬虫技术提供宝贵的参考资料。 适用人群: 这份项目合集适用于所有对Python爬虫开发感兴趣的人,无论你是学生、初学者还是有一定经验的开发者。无论你是想学习新的技术,还是想了解一个完整的项目开发流程,这份资料都将为你提供极大的帮助。 使用建议: 按部就班地学习:建议从基础的Python爬虫开发开始,逐步深入到实际应用中。通过实践,逐步掌握Python爬虫开发的各项技能。 参考项目文件和笔记:项目文件和笔记提供了丰富的背景信息和开发经验。在学习的过程中,不妨参考这些资料,以帮助你更好地理解和学习。 动手实践:Python爬虫开发是一门实践性很强的技能。通过实际操作,你可以更好地掌握Python爬虫开发的各项技能,并提高自己的实践能力。Python合法网页爬虫工具项目分享 内容概览: 这个分享包涵了我开发的Python爬虫工具项目,主要用于合法爬取某些网页信息。以下是主要内容: 源代码:包括Python代码和相关脚本。这些代码展示了如何使用Python进行网页抓取、解析和数据提取。 项目文件:除了代码,我还分享了整个项目的文件,包括设计稿、图标、图片等资源。这些资源对于理解项目背景和设计思路至关重要。 文档与操作手册:为了方便他人理解和使用我的作品,我编写了详细的操作手册和使用说明,同时提供了一份Markdown格式的文档,概述了项目的主要功能和特点。 学习笔记:在项目开发过程中,我记录了大量的学习笔记和心得体会。这些笔记不仅有助于理解项目的开发过程,还能为学习Python爬虫技术提供宝贵的参考资料。 适用人群: 这份项目合集适用于所有对Python爬虫开发感兴趣的人,无论你是学生、初学者还是有一定经验的开发者。无论你是想学习新的技术,还是想了解一个完整的项目开发流程,这份资料都将为你提供极大的帮助。 使用建议: 按部就班地学习:建议从基础的Python爬虫开发开始,逐步深入到实际应用中。通过实践,逐步掌握Python爬虫开发的各项技能。 参考项目文件和笔记:项目文件和笔记提供了丰富的背景信息和开发经验。在学习的过程中,不妨参考这些资料,以帮助你更好地理解和学习。 动手实践:Python爬虫开发是一门实践性很强的技能。通过实际操作,你可以更好地掌握Python爬虫开发的各项技能,并提高自己的实践能力。Python合法网页爬虫工具项目分享 内容概览: 这个分享包涵了我开发的Python爬虫工具项目,主要用于合法爬取某些网页信息。以下是主要内容: 源代码:包括Python代码和相关脚本。这些代码展示了如何使用Python进行网页抓取、解析和数据提取。 项目文件:除了代码,我还分享了整个项目的文件,包括设计稿、图标、图片等资源。这些资源对于理解项目背景和设计思路至关重要。 文档与操作手册:为了方便他人理解和使用我的作品,我编写了详细的操作手册和使用说明,同时提供了一份Markdown格式的文档,概述了项目的主要功能和特点。 学习笔记:在项目开发过程中,我记录了大量的学习笔记和心得体会。这些笔记不仅有助于理解项目的开发过程,还能为学习Python爬虫技术提供宝贵的参考资料。 适用人群: 这份项目合集适用于所有对Python爬虫开发感兴趣的人,无论你是学生、初学者还是有一定经验的开发者。无论你是想学习新的技术,还是想了解一个完整的项目开发流程,这份资料都将为你提供极大的帮助。 使用建议: 按部就班地学习:建议从基础的Python爬虫开发开始,逐步深入到实际应用中。通过实践,逐步掌握Python爬虫开发的各项技能。 参考项目文件和笔记:项目文件和笔记提供了丰富的背景信息和开发经验。在学习的过程中,不妨参考这些资料,以帮助你更好地理解和学习。 动手实践:Python爬虫开发是一门实践性很强的技能。通过实际操作,你可以更好地掌握Python爬虫开发的各项技能,并提高自己的实践能力。Python合法网页爬虫工具项目分享 内容概览: 这个分享包涵了我开发的Python爬虫

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值