Python2.7爬虫

Python爬虫

自己进行爬虫工作的记录

第一种方法,直接获取网页源码

请求消息头

在使用Python爬虫时,最好设置一下请求消息头,因为这个可以有效避免一些网站的反爬虫措施,修改headers就是让自己的爬虫伪装成浏览器去访问。

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}

网页编码格式

在使用Python爬虫时有时会出现乱码,这其实有一部分是因为网页源码的编码格式和你Python爬虫中设立的编码格式不一致导致的
查看网页源码的编码格式
按F12 -> 点击控制台(Console) -> 有一个输入位置的,输入document.charset -> 回车 -> 编码格式就会打印在控制台上了

如果发现网页编码格式是GBK,就需要修改Python爬虫中的编码格式,因为默认是utf-8

response = requests.get(爬虫地址, headers=上面的请求消息头, timeout=5)
response.encoding='GBK'

获取网页源码的内容

我主要使用find函数和find_all函数
find函数:查找对应的标签类型和标签名称,可以一层一层的找

find('div', class_="").find('').get_text()

find_all函数:查找一系列标签下的数据,常用于li和表格形式的网页源码,查出来的数据默认是数组,需要获取数据可以直接写出要第几个

find('div',class_='').find_all('')[1].get_text()

一般来说用这两个函数基本已经可以获取到全部的元素的,可能我爬的网站都比较简单把
我看完网上说解析源码有lxml和HTMLParser,因为我这边一直用的HTMLParser,用的也很不错,所以没有深入研究过

第二种方法,模拟浏览器获取网页源码

这种方式是按第一种方法后获取不到网页源码的情况下我采用的方式,这个我这边可以给出一个详细的列子,爬取的是一个app的网站,具体是什么就不说了

使用前提

安装selenium包,如果是idea工具的话,idea自己就可以下载,非常方便,file -> Project Structure -> SDKs -> Pakages -> 点边上的+号,搜索selenium 下载就行

代码

导入的包

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

模拟浏览器打开

browser = webdriver.PhantomJS()
    browser.set_page_load_timeout(60)
    print('打开网页。。。。')
    # browser.get(url)
    while True:
        try:
            browser.get(url)
            break
        except:
            pass

等待响应,以及获取数据,等待是直到获取到 代码中的属性值后在往下走,因为可能网页已经出来了 但是有些属性没有加载完成,这个时候我们去获取数据的时候就会有缺失,如果打开网页中有数字从0增长的情况,考虑增长的时间,在之后再多等待10~15s的时间,是页面的变化趋于稳定,以防获取到的数据还是处于增长的数据,

 #获取网页源码
    wait = WebDriverWait(browser,20).until(EC.visibility_of_element_located((By.CLASS_NAME,'属性')))
    time.sleep(10)

    print('开始获取数据')
    data = browser.page_source

获取元素属性

seq = browser.find_element_by_class_name('').find_elements_by_class_name('')[i] \
        .find_elements_by_class_name('')[0].text
app_name = browser.find_element_by_class_name('').find_elements_by_class_name('')[i] \
        .find_elements_by_class_name('')[1].text
app_type = browser.find_element_by_class_name('').find_elements_by_class_name('')[i] \
        .find_elements_by_class_name('')[2].text
app_info = app_name+'^'+app_type+'\n'
posted @ 2021-03-03 16:34  otowa  阅读(154)  评论(0)    收藏  举报