爬虫补充学习,带Python学习

1.BeautifulSoup
获取li下内容,并输出得分大于3的数据

知识点:zip,stripped_strings

from bs4 import BeautifulSoup

data = []
path = './web/new_index.html'

with open(path, 'r') as f:
    Soup = BeautifulSoup(f.read(), 'lxml')
    titles = Soup.select('ul > li > div.article-info > h3 > a')
    pics = Soup.select('ul > li > img')
    descs = Soup.select('ul > li > div.article-info > p.description')
    rates = Soup.select('ul > li > div.rate > span')
    cates = Soup.select('ul > li > div.article-info > p.meta-info')

//使用zip直接将获取的标签组存入字典中
//zip()返回一个序列(列表)对象.
//zip([seql, ...])接受一系列可迭代对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。
for title, pic, desc, rate, cate in zip(titles, pics, descs, rates, cates):
    info = {
        'title': title.get_text(),
        'pic': pic.get('src'),
        'descs': desc.get_text(),
        'rate': rate.get_text(),
        'cate': list(cate.stripped_strings) //第一次见。
        //.stripped_strings 可以去除多余空白内容,这里实现的是获取p标签下所有的内容,并保存为列表
    }
    data.append(info)

for i in data:
    if len(i['rate']) >= 3:
        print(i['title'], i['cate'])

结果

Sardinia’s top 10 beaches [‘fun’, ‘Wow’]
How to get tanned [‘butt’, ‘NSFW’]
How to be an Aussie beach bum [‘sea’]
Summer’s cheat sheet [‘bay’, ‘boat’, ‘beach’]

2.Beautifulsoup
获取真实网页

from bs4 import BeautifulSoup
import requests

url = 'https://cn.tripadvisor.com/Attractions-g60763-Activities-New_York_City_New_York.html'
wb_data = requests.get(url)
soup      = BeautifulSoup(wb_data.text,'lxml')
//网页中定位元素位置,获取一组数据
titles    = soup.select('div.listing_title > a[target="_blank"]')
imgs      = soup.select('img[width="180"]')
cates     = soup.select('div.p13n_reasoning_v2')
# print(cates)

for title,img,cate in zip(titles,imgs,cates):
    data = {
        'title'  :title.get_text(),
        'img'    :img.get('src'),
        'cate'   :list(cate.stripped_strings),
        }
    print(data)

上面获取到的img地址不是真实的,小技巧如果是js动态加载的页面,可以模拟手机浏览,使用User-Agent,因为手机的反爬策略有时没有那个严格

User-Agent : Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Mobile Safari/537.36

3.动态分页

一种实现方式

from bs4 import BeautifulSoup
import requests
import time

url = 'https://knewone.com/discover?page='

//方法中直接变量赋初值
def get_page(url,data=None):

    wb_data = requests.get(url)
    soup = BeautifulSoup(wb_data.text,'lxml')
    imgs = soup.select('a.cover-inner > img')
    titles = soup.select('section.content > h4 > a')
    links = soup.select('section.content > h4 > a')

    if data==None:
        for img,title,link in zip(imgs,titles,links):
            data = {
                'img':img.get('src'),
                'title':title.get('title'),
                'link':link.get('href')
            }
            print(data)


//一种分页实现方式
def get_more_pages(start,end):
    for one in range(start,end):
        get_page(url+str(one))
        time.sleep(2)

get_more_pages(1,10)

*//方法中直接变量赋初值
def get_page(url,data=None):
//一种分页实现方式
def get_more_pages(start,end):*

4.动态加载以及if语句

下面代码比较老了,直接运行会报错,而且现在58反爬很严格,经常需要验证码页面

from bs4 import BeautifulSoup
import requests
import time

url = 'http://bj.58.com/pingbandiannao/24604629984324x.shtml'

wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text,'lxml')

def get_links_from(who_sells):
    urls = []
    list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_sells))
    wb_data = requests.get(list_view)
    soup = BeautifulSoup(wb_data.text,'lxml')
    for link in soup.select('td.t a.t'):
        urls.append(link.get('href').split('?')[0])
    return urls

//访问量是动态加载的,通过直接查找sources中方法获取访问量(现在在浏览器中可以看到,直接访问地址数据也是0了,反爬策略之类比较严格了)
//如果按照标签直接抓取,会是0,因为js控制的原因。
//为了对付反盗链,需要伪造的referer:
//防盗链就是需要在请求的头部加入Referer字段, Referer 指的是HTTP头部的一个字段, 用来表示从哪儿链接到目前的网页,采用的格式是URL。换句话说,借着 HTTP Referer 头部网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。

def get_views_from(url):
    id = url.split('/')[-1].strip('x.shtml')
    api = 'http://jst1.58.com/counter?infoid={}'.format(id)
    # 这个是找到了58的查询接口,不了解接口可以参照一下新浪微博接口的介绍
    header = {
      'User-Agent':xxx
      'Referer':xxx
      'Cookie':xxx
    }
    js = requests.get(api, headers=header)
    views = js.text.split('=')[-1]
    return views
    # print(views)


def get_item_info(who_sells=0):

    urls = get_links_from(who_sells)
    for url in urls:

        wb_data = requests.get(url)
        soup = BeautifulSoup(wb_data.text,'lxml')
        data = {
            'title':soup.title.text,
            //select返回的是一个数组列表
            'price':soup.select('#basicinfo span.price')[0].text,
            //有的页面下面没有.c_25d样式 使用 if后置判断防止报错
            'area' :list(soup.select('.c_25d')[0].stripped_strings) if soup.find_all('span','c_25d') else None,
            'date' :soup.select('div.detail-title__info__text')[0].text,
            'cate' :'个人' if who_sells == 0 else '商家',
            'views':get_views_from(url)
        }
        print(data)

get_item_info()

动态加载也可以看Sources中的东西,是否有对应的方法
js反盗链,requests.get时加入header

select返回的是一个数组列表,所以需要soup.select(‘#basicinfo span.price’)[0].text

if的使用
//有的页面下面没有.c_25d样式 使用 if后置判断防止报错
‘area’ :list(soup.select(‘.c_25d’)[0].stripped_strings) if soup.find_all(‘span’,’c_25d’) else None,
根据值判断
‘cate’ :’个人’ if who_sells == 0 else ‘商家’,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值