python爬虫入门

目录

  • 简介
  • 获取
    • 方法一:selenium webdriver.get(url)
    • 方法二:requests
    • 方法三:urllib
    • 方法四:手动
  • 解析
    • 什么是xpath
    • 什么是正则表达式
    • 什么是selector
    • 方法一:selenium find_elements()
    • 方法二:lxml.etree
    • 方法三:BeautifulSoup
    • 方法四:HTMLParser
    • 方法五:re(正则表达式)

简介

爬虫程序主要内容就两部分。
1,html获取器
2,html解析器
入门足够了。管理url、伪装用户行为、运行javascript等属于高级操作,不算入门,俺也没学过。
最后附上环境搭建部分。

以下各小节均以从ICML2021会议官网上爬取paper列表为例。

获取

获取网页信息有很多种方法,在此我记录一下我遇到过的几种,并分析它们的用途特点。

方法一:selenium webdriver.get(url)

【推荐】

from selenium import webdriver
url="https://icml.cc/Conferences/2021/Schedule?type=Poster"
driver = webdriver.Firefox()
driver.get(url)
# 到这里已经算是获取到了网页信息,因为selenium库中的各种API支持对网页进行各种查询、操作

# 如果想进一步获得全部html代码
from selenium.webdriver.common.by import By
element = driver.find_element(By.XPATH,'/html')
html = element.get_attribute('outerHTML')

selenium的安装配置较为麻烦,它需要单独下载各个浏览器对应的driver(Chrome、Firefox、IE等很多浏览器都支持),还要配置系统环境变量。
但它的效果也是最好的。有些网页会动态生成内容,这时就只能伪装成用户,使用浏览器运行javascripts。当然js一般是自动运行的。不使用浏览器或js运行环境的方法,一般只能获得网页初始的静态内容。

方法二:requests

import requests        #导入requests包
url = "https://icml.cc/Conferences/2021/Schedule?type=Poster"
html = requests.get(url)        #Get方式获取网页数据
print(html.text)

以上是GET方法,POST方法我暂时还不懂。

方法三:urllib

from urllib import request
url = "https://icml.cc/Conferences/2021/Schedule?type=Poster"
html = request.urlopen(url).read()
html.decode()

方法四:手动

打开浏览器,输入目标url,Ctrl+S保存页面到.html,再在程序中读取文件。

with open('xxx.html','r') as f:
	html = f.read()
print(html)

解析

解析最重要的任务在于,找到想找的东西,不错找,不漏找。

什么是xpath

【推荐】
教程:w3school xpath
xpath大概长这样:/html/body/div[@class='container']
xpath甚至有内建函数,功能十分齐全。
注意,xpath中的索引从1开始。

什么是正则表达式

大概长这样:\d{1,3}(.\d{1,3}){3},这是表达IPv4地址的正则表达式(不过只限制了数字位数,没有限制三位数≤255)。

什么是selector

类似于xpath的一种html路径表达法,但感觉没有xpath支持性广。例如Firefox就复制不了selector。

方法一:selenium find_elements()

from selenium import webdriver
url="https://icml.cc/Conferences/2021/Schedule?type=Poster"
driver = webdriver.Firefox()
driver.get(url)
# 以上和html获取小节内容相同

from selenium.webdriver.common.by import By
xpath = "/html/body/div[@class='container pull-left']/div[@id='wholepage']/main[@id='main']/div[@class='container']/div[@class='row']/div[@class='col-xs-12 col-sm-9']/div[position()>3]/div"
driver.find_elements(By.XPATH,xpath)
# 这会返回一个列表,列表中的元素全部都是WebElement(selenium定义的变量类型)。

如使用find_elements则返回所有符合的元素,如使用find_element则返回第一个命中的元素。
但这种方法有一定问题。
1,浏览器放置时间久一点,selenium的API就会失去连接,而selenium的API只能对活动中的浏览器进行操控。
2,selenium没有提供针对html代码的解析程序。

方法二:lxml.etree

【推荐】

from lxml import etree
# html是html格式的字符串
Selector = etree.HTML(html)
xpath = "/html/body/div[@class='container pull-left']/div[@id='wholepage']/main[@id='main']/div[@class='container']/div[@class='row']/div[@class='col-xs-12 col-sm-9']/div[position()>3]/div"
Selector.xpath(xpath)

具体的用法我还没有仔细研究,但大体来说lxml是支持xpath的。
lxml本身也是BeautifulSoup的依赖库之一,其功能可以弥补selenium的缺点。

方法三:BeautifulSoup

from bs4 import BeautifulSoup
# 假设html为html格式的字符串
soup = BeautifulSoup(strhtml.text,'lxml') # 需要预先安装lxml
data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a') # 似乎不是xpath

BeautifulSoup和XPath的原理不一样,BeautifulSoup是基于DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多。而lxml只会局部遍历。
就我个人的应用需求来说,BeautifulSoup不如selenium+lxml好用。

方法四:HTMLParser

from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        """
        recognize start tag, like <div>
        :param tag:
        :param attrs:
        :return:
        """
        print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
        """
        recognize end tag, like </div>
        :param tag:
        :return:
        """
        print("Encountered an end tag :", tag)

    def handle_data(self, data):
        """
        recognize data, html content string
        :param data:
        :return:
        """
        print("Encountered some data  :", data)

    def handle_startendtag(self, tag, attrs):
        """
        recognize tag that without endtag, like <img />
        :param tag:
        :param attrs:
        :return:
        """
        print("Encountered startendtag :", tag)

    def handle_comment(self,data):
        """

        :param data:
        :return:
        """
        print("Encountered comment :", data)


parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1><img src = "" />'
            '<!-- comment --></body></html>')

(以上这段代码摘自Python爬虫常用之HtmlParser
HTMLParser是python自带的功能,但设计起来非常麻烦,需要继承HTMLParser类,进行新类的定义,并且五种方法重载也十分不人性化。
然而网上查到的方法很多都是这种,难道它们都是用爬虫在互相爬取然后复制么。

方法五:re(正则表达式)

import re
# html是html格式的字符串
pattern = r'<a href=[^>]*>(.*)</a>'
result = re.findall(pattern, html)


最后这里免费分享给大家一份Python全台学习资料,包含视频、源码。课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
编程资料、学习路线图、源代码、软件安装包【点击这里】领取!

Python所有方向的学习路线图,清楚各个方向要学什么东西
100多节Python课程视频,涵盖必备基础、爬虫和数据分析
100多个Python实战案例,学习不再是只会理论
华为出品独家Python漫画教程,手机也能学习
历年互联网企业Python面试真题,复习时非常方便
请添加图片描述
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值