python

python
  之前学的每门语言都是浅浅浅浅浅浅浅尝辄止看看能不能深入一点

文件读取

#2019-10-11 21:00:57
# 读
f = open("/tmp/foo.txt", "w")

f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )

# 关闭打开的文件
f.close()

##另一种写法
with open('TTBT.txt', 'r') as f:
    print(f.read())

#写
# 打开一个文件
f = open("/tmp/foo.txt", "r")

str = f.read()
print(str)

# 关闭打开的文件
f.close()

#另一种写法
with open('TTBT.txt', 'a+') as f:
    f.write("ss")

爬虫

设置代理ip

代理ip的网址
当前ip的网址

#2019-10-06 22:04:57
import urllib.request
import random
url = 'http://icanhazip.com'

#参数是一个字典{'类型','代理ip:端口号'}
iplist = ['124.156.108.71:82','183.146.213.157:80','39.137.69.6:80']
proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})

#定制、创建一个opener
opener = urllib.request.build_opener(proxy_support)

#改useragent
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36')]

#安装opener
urllib.request.install_opener(opener)

#调用
response = urllib.request.urlopen(url)

html = response.read().decode('utf-8')#.encode('GBK','ignore').decode('GBk')
print('当前代理IP是'+html)

贴吧图片

正则表达式写法很重要

#2019-10-07 20:54:07
#fun.py
import urllib.request
import re
def  open_url(url):
  req = urllib.request.Request(url)
  req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36')
  page = urllib.request.urlopen(req)
  html = page.read().decode('utf-8')
  return html

def get_img_tieba(html,path=''):
  p = r'<img class="BDE_Image".*?src="([^"]+\.jpg)"'
  imglist = re.findall(p,html)

  # for each in imglist:
  #   print(each)

  for each in imglist:
    filename = path+each.split("/")[-1]
    urllib.request.urlretrieve(each,filename,None)

import fun
import re

html=fun.open_url('https://tieba.baidu.com/p/6234466251')

fun.get_img_tieba(html,'F:/lkyblogcode/python/')

Scarpy框架(小甲鱼)

2019-10-09 22:43:57
文档

创建一个Scrapy项目

cd到一个目录执行”scrapy startproject 名称

定义Item容器

修改items.py的内容

#items.py
import scrapy


class DmozItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

编写爬虫

编写爬虫类Spider,Spider是用户编写用于从网站上爬取数据的类。其包含了一个用于下载的初始URL,然后是如何跟进网页中的链接以及如何分析页面中的内容,还有提取生成item的方法

命令行创建Spider:
scrapy genspider chinadmoz.org
或者自己写

#dmoz_spider此为简化写法详见小甲鱼教程
import scrapy

class DmozSpider(scrapy.Spider):#需要继承scrapy.Spider类

  #scrapy crawl 'name'
  name = "dmoz"

  #网站
  allowed_domains = ['chinadmoz.org']

  #从哪里开始
  start_urls = [
    'http://www.chinadmoz.org/subindustry/9/',
    'http://www.chinadmoz.org/subindustry/14/'
    ]

  #把爬下来的网页代码保存
  def parse(self,response):
      filename = response.url.split("/")[-2]
      with open(filename,'wb') as f:
        f.write(response.body)

提取网页中需要的数据,在Scrapy中是使用一种基于XPath和CSS的表达式机制:Scrapy Selectors
Selector是一个选择器,它有四个基本的方法:
  xpath():传入xpath表达式,返回该表达式所对应的所有节点的selector list列表。
  css():传入Css表达式,返回该表达式所对应的所有节点的selector list列表。
  extract():序列化该节点为unicode字符串并返回list。
  re():根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。

①在shell里实验
scrapy shell “url”之后使用上述方法筛选需要的信息(要用双引号)
response.xpath(‘//标签名’) 选出所有标签的内容
/li/a/text() 这样取得是text内容
response.xpath(‘//标签名’).extract() ……并字符串化

response.xpath(‘//ul/li/a/@href’)
response.xpath(‘//ul[@class=”…”]/li’)根据类名筛
response.xpath(‘//标签名[position()<3]’)选出前两个

②实验好了修改爬虫代码

#dmoz_spider
import scrapy

class DmozSpider(scrapy.Spider):

  #scrapy crawl 'name'
  name = "dmoz"

  #网站
  allowed_domains = ['chinadmoz.org']

  #从哪里开始
  start_urls = [
    'http://www.chinadmoz.org/subindustry/9/',
    'http://www.chinadmoz.org/subindustry/14/'
    ]

  #爬取网址信息
  def parse(self,response):
    # filename = response.url.split("/")[-2]
    # with open(filename,'wb') as f:
    #   f.write(response.body)
    sel = scrapy.selector.Selector(response)
    sites = sel.xpath('//ul[@class="boxbdnopd"]/li')
    for site in sites:
        title = site.xpath('div[@class="listbox"]/h4/@title').extract()
        link = site.xpath('div[@class="listbox"]/h4/a/@href').extract()
        desc = site.xpath('div[@class="listbox"]/h4/a/text()').extract()
        print(title,link,desc)

命令行执行scrapy crawl ‘id’

存储内容

#dmoz_spider
import scrapy
from tutorial.items import DmozItem

class DmozSpider(scrapy.Spider):

  #scrapy crawl 'name'
  name = "dmoz"

  #网站
  allowed_domains = ['chinadmoz.org']

  #从哪里开始
  start_urls = [
    'http://www.chinadmoz.org/subindustry/9/',
    'http://www.chinadmoz.org/subindustry/14/'
    ]

  #存到容器里
  def parse(self,response):
    # filename = response.url.split("/")[-2]
    # with open(filename,'wb') as f:
    #   f.write(response.body)
    sel = scrapy.selector.Selector(response)
    sites = sel.xpath('//ul[@class="boxbdnopd"]/li')
    items=[]
    for site in sites:
      item = DmozItem()
      item['title'] = site.xpath('div[@class="listbox"]/h4/@title').extract()
      item['link'] = site.xpath('div[@class="listbox"]/h4/a/@href').extract()
      item['desc'] = site.xpath('div[@class="listbox"]/h4/a/text()').extract()
      items.append(item)

    return items

命令行执行scrapy crawl dmoz -o items.json -t json
-o 文件名 -t 文件格式
修改输出文件编码:在settings.py加入FEED_EXPORT_ENCODING = ‘utf-8’即可

scrapy css选择器使用

教程

所有爬虫文章源头

随记

xpath选择 td[i]表示选择第几个 编号从1开始
find_element_by_xpath返回一个
find_elements_by_xpath返回个列表输出特定位置要find_element_by_xpath[0] 编号从零开始


   转载规则


《python》 刘坤胤 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录