Python练手例子

一:爬取豆瓣电影top250地址

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
import re
def split(str,regular):  #正则表达式过滤字符串

    return re.split(regular,str)

def trans_list(main_list,sub_list):

    index=main_list.index(sub_list)
    sub_list.reverse()  #反转list的排列
    for ele in sub_list:
        main_list.insert(index,ele)  #后一以元素插入在前一元素之前
    main_list.pop(main_list.index(sub_list))
    return main_list

def extract_info(li_tag):
    #使用.stripped_strings更方便

    info=[]
    for string in li_tag.stripped_strings:
        info.append(string)
    #info=['1', '肖申克的救赎', '/\xa0The Shawshank Redemption', '/\xa0月黑高飞(港)  /  刺激1995(台)',
    #'[可播放]', '导演: 弗兰克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·罗宾斯 Tim Robbins /...',
    #'1994\xa0/\xa0美国\xa0/\xa0犯罪 剧情', '9.6', '693081人评价', '希望让人自由。']

    if '[可播放]' in info:
        index=info.index('[可播放]')
        info.pop(index)  #delete unused info,the index-1
    class_hd=li_tag.find('div',{'class':'hd'})
    if len(class_hd.a.find_all('span'))==2:
        if '  /  ' in info[2]:
            info.insert(2,np.NaN)  #缺失则插入NaN,注意index
            info[3]=info[3][2:]
        else:
            info[2]=info[2][2:]
            info.insert(3,np.NaN)
    else:
        info[2]=info[2][2:]  #MovieName,\xa0表示16进制下A0的一个数,为一个字符
        info[3]=info[3][2:]  #EnglishName
    Dir_and_Act=split(info[4],r':|\xa0\xa0\xa0')  #正则表达式分割字符串
    if len(Dir_and_Act)<4:
        Dir_and_Act.append('NaN')
    Yea_Cou_Gen=split(info[5],r'\xa0/\xa0')
    info[4]=Dir_and_Act
    info[5]=Yea_Cou_Gen
    info=trans_list(info,Dir_and_Act)
    info=trans_list(info,Yea_Cou_Gen)
    info.pop(4)  #去除‘导演’
    info.pop(5)  #起初’演员‘
    return info  #返回一行movie的数据,list的形式

def collecting_data(url,database):

    soup=BeautifulSoup(urlopen(url),'lxml')
    movie_grid=soup.find_all('ol',{'class':'grid_view'})  #找到电影表单
    movie=movie_grid[0].find_all('li')
    for li in movie:
        database.append(extract_info(li))  #data为list前提下,DataFrame([data])为行排列,DataFrame(data)为列排列
    return database  #database=[[],[],[],....]



def collect_all(url):

    database=[]
    collecting_data(url,database)
    data=pd.DataFrame(database)
    return data  #返回一行daframe格式



#mian
#url=r'https://movie.douban.com/top250?start=0&filter='#豆瓣电影top250地址
page=[]
for sequence in list(range(0,250,25)):

    url=r'https://movie.douban.com/top250?start=%d&filter=' %sequence  #所有top250的网页地址
    page.append(collect_all(url))  #添加数据

GeneralData=pd.DataFrame()
for i in range(len(page)):
    GeneralData=pd.concat([GeneralData,page[i]],ignore_index=True)  #pd.concat:[]内要为DataFrame形式,

#保存数据,待整理分析
GeneralData=GeneralData.drop(0,axis=1)  #去除编号的一列
column=['MovieName','EnglishName','OtherName','Director',\
        'Actors','Year','Country','Grenre','Rating10','RatingNum',\
        'Description']
GeneralData.columns=column
GeneralData.to_csv('MovieTop250.csv',encoding='utf-8')  #此函数默认解码方式为utf-8,但是在保存时不加encoding的话,读取会产生错误
GeneralData.to_csv('Movie.csv')
print("成功保存数据")

二:正则抓取

import requests
import re
from requests.exceptions import RequestException

def gethtml(url):
    try:
        # 获取网页html内容
        response = requests.get(url)
        print(response)
        # 通过状态码判断是否获取成功
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None
def parse_html(html):
    pattern=re.compile('<a.*?>.*?title">(.*?)</span>.*?other">(.*?)</span>.*?</div>',re.S)
    items=re.findall(pattern,html)
    print(items)
    print("-------------")
    #变成字典
    for item in items:
        #yield把方法变成生成器
      yield{
          "name":item[0],
          "other":item[1].strip(" '&nbsp;/&nbsp;")
      }

def main():
    url = "https://movie.douban.com/top250"
    html=gethtml(url)
    for item in parse_html(html):
        print(item)


if __name__ == '__main__':
    main()

三:requests+xpath

通过检查元素,copy XPath获得xpath

# -*-coding:utf-8 -*-
import requests
from lxml import etree
url = 'https://movie.douban.com/subject/1292052/'
data = requests.get(url).text
s=etree.HTML(data)
film=s.xpath('//*[@id="content"]/h1/span[1]/text()')
director=s.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')
time=s.xpath('//*[@id="info"]/span[10]/text()')
runtime=s.xpath('//*[@id="info"]/span[13]/text()')
print("电影名称:",film)
print("导演:",director)
print("上映时间:",time)
print("片长::",runtime)

四:爬取豆瓣TOP250的图书信息

# -*-coding:utf-8 -*-
from lxml import etree
import requests
import time

for a in range(10):
    url = 'https://book.douban.com/top250?start={}'.format(a*25)
    data = requests.get(url).text

    s=etree.HTML(data)
    file=s.xpath('//*[@id="content"]/div/div[1]/div/table')
    time.sleep(3)

    for div in file:
        title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
        href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]
        score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
        num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip()
        scrible=div.xpath("./tr/td[2]/p[2]/span/text()")

        if len(scrible) > 0:
            print("书名:{},网页:{},评分:{},评价人数:{},评价:{}\n".format(title,href,score,num,scrible[0]))
        else:
            print("{},{},{},{}\n".format(title,href,score,num))

五:爬取租房信息

1、单页

# -*-coding:utf-8 -*-
from lxml import etree
import requests
import time
url = "http://sz.xiaozhu.com/"
data = requests.get(url).text
s=etree.HTML(data)
file=s.xpath('//*[@id="page_list"]/ul/li')
time.sleep(1)

for name in file:
    title = name.xpath('./div[2]/div/a/span/text()')[0]
    price = name.xpath('./div[2]/span[1]/i/text()')[0]
    scrible = name.xpath('./div[2]/div/em /text()')[0].strip()
    pic = name.xpath('./a/img/@lazy_src')[0]
    print("标题:{},价格:{},描述:{},图片:{}\n".format(title,print,scrible,pic))

2、多页,储存数据到本地

# -*-coding:utf-8 -*-
from lxml import etree
import requests
import time
with open('D:\PycharmProjects/test.txt','w',encoding='utf-8') as f:
     for a in range(1,10):
         url = 'http://sz.xiaozhu.com/search-duanzufang-p{}-0/'.format(a)
         data = requests.get(url).text
         s=etree.HTML(data)
         file=s.xpath('//*[@id="page_list"]/ul/li')
         time.sleep(1)
         for name in file:
             title = name.xpath('./div[2]/div/a/span/text()')[0]
             price = name.xpath('./div[2]/span[1]/i/text()')[0]
             scrible = name.xpath('./div[2]/div/em /text()')[0].strip()
             pic = name.xpath('./a/img/@lazy_src')[0]
             print("标题:{},价格:{},描述:{},图片:{}\n".format(title,print,scrible,pic))
             f.write("标题:{},价格:{},描述:{},图片:{}\n".format(title, price, scrible, pic))

如果储存格式是CSV的话会出现乱码,首先要用记事本打开,然后另存为 – 选择编码为“ANSI”,再打开。

持续更新中!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Python练手经典100例》是一本适合初学者练习和巩固Python编程基础的经典教材。这本教材共包含100个不同难度的编程实例,涵盖了Python中的各个基本知识点和应用场景。 这些实例从简单到复杂,每个实例都有明确的指导和解答。通过实例练习,读者可以学会如何使用Python语言进行编程,并且学习到一些常见的编程技巧和思维方式。 这本教材的实例内容非常丰富多样,例如计算器、猜数字、生成斐波那契数列、实现进度条等等。每个实例都带有详细的说明和代码,读者可以按照教材进行一步步的实践。 通过练习这些实例,读者可以加深对Python语言的理解和掌握,培养编程思维和逻辑思维能力。同时,由于实例有多个难度级别,读者可以根据自己的编程水平挑选相应的实例进行练习,逐渐提高自己的编程能力。 总之,《Python练手经典100例》是一本非常适合初学者练习的经典教材,无论是对于掌握Python编程基础知识,还是培养编程思维能力,都有很大的帮助。对于想要通过实践提高编程水平的读者来说,这本教材绝对是不可或缺的学习资料。 ### 回答2: Python练手经典100例是一本非常受欢迎的Python编程教程,其目的是通过实践来提高Python编程技能。这本教程包括了100个经典的练习题,涵盖了Python语法的各个方面,适合初学者和有一定基础的学习者。 这本教程的例子非常实用,从简单到复杂,逐步引导学习者提高编程能力。通过这些例子的实践,学习者可以了解并掌握Python的基本语法、条件语句、循环语句、字符串操作、列表操作、字典操作、文件操作等常用编程技巧。同时,这些例子涉及到了常见的算法和数据结构,学习者可以通过实现这些例子来加深对算法和数据结构的理解和应用。 除了提高编程能力,这本教程还培养了学习者的解决问题的能力。每个例子都是一个具体的问题,学习者需要用编程语言来解决这个问题。通过思考和实践,学习者可以发展自己的解决问题的方法和思维方式,培养了学习者的逻辑思维和分析问题的能力。 这本教程的方法非常灵活,学习者可以按照自己的节奏进行学习。每个例子都有详细的题目描述和示例代码,学习者可以先尝试自己解决问题,然后再参考示例代码进行对比和学习。同时,这本教程还提供了额外的提示和技巧,帮助学习者更好地理解问题和解决方法。 总之,Python练手经典100例是一本非常优秀的Python编程教程。通过实践这些例子,学习者可以提高编程能力,掌握Python语法和常用编程技巧,并培养解决问题的能力。无论是初学者还是有一定基础的学习者,都可以从中受益匪浅。 ### 回答3: Python练手经典100例是一个常见的编程练习集合,旨在帮助初学者熟悉Python编程语言和解决问题的能力。 这个集合有100个问题,每个问题提供了一个特定的场景或需求,要求编写Python代码实现相应的功能。 这些问题涵盖了Python编程的各个方面,包括基本的数据类型操作、字符串处理、列表和字典的使用、条件判断和循环语句、文件IO、函数定义和参数传递等。 通过练习这100个例子,可以学习和掌握Python的基础语法和常用的编程技巧,提高解决问题的思维能力和编码能力。 值得一提的是,这些练习题并不仅限于初学者,对于有一定经验的Python开发者来说,也是很好的巩固和提高编程能力的途径。 总之,Python练手经典100例是一个非常有用的编程练习集合,通过反复练习这些例子,可以加深对Python语言的理解和应用,提升编程技能。对于想要学习或进一步提高Python编程能力的人来说,这是一个很好的资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值